我有一个用管道定界的平面文件,大约有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);
}
}
}