使用SSIS

时间:2018-12-14 18:44:27

标签: file ssis split record flat

我有一个用管道定界的平面文件,大约有25,000行,但是有些行有空格,而另一些行则有多个标题和子标题。我只想保留一个标题行,而忽略所有其他标题行,副标题行和带空格的行。我在本文结尾处使用了C#脚本,并使用StreamReader和StreamWriter进行了此操作,但是尽管该脚本可以正常工作,但仍花费了9个小时来运行。我最近开始使用SSIS,现在正在研究使用SSIS条件拆分转换。

我的数据看起来像这样:

*[white space]* Business Unit: 099 - HAA/DEPT OF SSSSSS SSSSSSSS
*[white space]* Empl Id  |  Employee Name  |  Dept Id  |  Department  |  EE Home Phone  |  Emergency Contact Name  |  Primary  |  Telephone  |  Relationship 
*[white space]*  0144111 | Adams Cdddddddd | 0990101 | Executive/Director-NM | *********** | *****NO CONTACT***** |  |  |   1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM |
*********** | AAALL SELLELL | Y | 646/711-9999| Parent 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | YYYXXX DeVaaa | N | 212/344-2222| Oth Relat 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | SSLL Wildddd | N | 917/255-5555| Oth Relat 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | CCLL A. Sree | N | 917/666-3333| Friend
*[white space]*  Business Unit: 099 - HAA/DEPT OF SSSSSS SSSSSSSS
*[white space]* Empl Id  |  Employee Name  |  Dept Id  |  Department  |  EE Home Phone  |  Emergency Contact Name  |  Primary  |  Telephone  |  Relationship 
*[white space]*  0144111 | Adams Cdddddddd | 0990101 | Executive/Director-NM | *********** | *****NO CONTACT***** |  |  |   1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM |
*********** | AAALL SELLELL | Y | 646/711-9999| Parent 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | YYYXXX DeVaaa | N | 212/344-2222| Oth Relat 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | SSLL Wildddd | N | 917/255-5555| Oth Relat 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | CCLL A. Sree | N | 917/666-3333| Friend

SSIS数据流包含以下内容:1)具有类似数据的平面文件源,如上所示。有9列。 2)具有以下条件的条件拆分,该条件拆分为“多播”,“多播1”和“多播2”:

i)RowsToOmit LTRIM(RTRIM([Empl Id]))==“” ii)SecondTextToOmit LTRIM(RTRIM([Empl Id]))==“业务单位:099-SSSS的HAA / DEPT SSSSSSSSSS”

iii)好行转到:GoodRows。最终,我也想省略以下Header的所有其他出现,但只保留第一个出现: “ Empl ID |员工名称| Dept ID |部门| EE家庭电话|紧急联系人姓名|主要|电话|关系”

我准备了SSIS程序包,但是运行它时出现以下错误:

  

错误:HAA条件拆分转换,平面文件时出现0xC02020A1   源[1]:数据转换失败。列的数据转换   “ Empl ID”返回状态值4和状态文本“ Text was   截断或目标代码中一个或多个字符不匹配   页面。”错误:HAA条件拆分转换中的错误:0xC020902A,   平面文件源[1]:“输出列“ Emp Id“(63)”失败   因为发生了截断,并且截断行的配置在   “输出列“ Empl ID”(63)”指定截断失败。一种   指定对象的指定对象发生截断错误   零件。在HAA条件拆分转换中,错误:0xC0202092,   平面文件源[1]:处理文件时发生错误   数据行上的“ Z:\紧急联系报告\ TEST \ PER004-069-TEST.txt”   251.在HAA条件拆分转换SSIS上,错误:0xC0047038。管道:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。的   组件“平面文件源”(1)上的PrimeOutput方法返回错误   代码0xC0202092。组件返回错误代码时,   流水线引擎称为PrimeOutput()。故障代码的含义   由组件定义,但错误是致命的,流水线   停止执行。在此之前可能会发布错误消息   并提供有关失败的更多信息。

为什么我会收到此错误? 最终,我只想保留一个标题行,而忽略所有其他标题行,副标题行和带空格的行。您还可以帮助我确定完成此工作的最佳,最有效的方法吗?

C#脚本:

using (StreamReader sr = new StreamReader(sourcePath))
{
    while ((Line = sr.ReadLine()) != null)
    {  
        // Write 1st occurance of Heading
        if (Line.Trim() == headerText && headerCount == 0)
        {
            outputText = outputText + Line + Environment.NewLine;
            headerCount++;
        }
        else
            //store text in variables to do checks all in same if statement
            if (Line.Trim() != "" && Line.Trim() != headerText && Line != headerText && Line != secondTextToOmit && Line != thirdTextToOmit)
            {
                outputText = outputText + Line + Environment.NewLine;
            }
        using (StreamWriter writer = new StreamWriter(destinationPath))
        {
            //write the string using filtered text
            writer.WriteLine(outputText);
        }
    }
}

0 个答案:

没有答案