将平面文件导入SSIS时遇到问题。
文件用“ |”分隔并以“ ;;”作为分隔符。但是,分隔符不一致。有时,在和的行中,只有“;”或者什么都没有 ””。导入到SSIS时,我得到结果
Column 1 Column 2 Column 3 Column 4 Column 5
a b c d e;|a1|b1|c1|d1|e1
这应该看起来像
Column 1 Column 2 Column 3 Column 4 Column 5
a b c d e
a1 b1 c1 d1 e1
问题来了,因为在第一行中只有一个“;”或一个都不存在。 注意,这是一个示例,许多行都是正确的,并带有“ ;;”。作为决定者。我只是指出问题所在。
.csv文件看起来像
Column 1|Column 2|Column 3|Column 4|Column 5;;
a|b|c|d|e;
a1|b1|c1|d1|e1;;
并且应该看起来像
Column 1|Column 2|Column 3|Column 4|Column 5;;
a|b|c|d|e;;
a1|b1|c1|d1|e1;;
数据集非常大,几乎有600.000行和50列。
我遇到的第一个问题是导入文件时,因为SSIS标准数据类型读取为string [DT_STR]
。长度为50
。由于有时会有多行带有错误的分隔符,因此我在最后一列单元格中得到了很长的字符串。我使用Visual Studio,然后在“高级编辑器”中将长度更改为很大。
Advanced editor in Visual studio were I have changed the length
所以问题是,我如何在SSIS和Visual Studio社区中将某些单元格中的值分隔为一列,然后将它们拆分为一个新的行(具有已定义的列变量)。
我尝试手动查找所有出现错误的情况,并在.csv文件中对此进行了更改。在此SSIS工作之后。但这不是一个持久的解决方案,因为我每个月都会收到一个新文件。
我尝试阅读以下建议:
Split a single column of data with comma delimiters into multiple columns in SSIS
但是他们的问题不一样,因为他们具有复制的列值,并且我想要整行。
感谢您的帮助, ss
!!编辑尝试使用J Weezy和R M的答案:!!
我尝试创建脚本任务并遵循该解决方案。
在Visual Studio中,我使用脚本组件添加脚本任务,然后选择“转换”。在“输入列”下,选择全部。
此后,我将平面文件源定向到脚本组件并运行代码。这样运行脚本(脚本组件不执行任何操作)即可。
然后在脚本组件中输入“编辑脚本”,然后在public override void Input0_ProcessInputRow(Input0Buffer Row)
下输入(使用R M的帮助):
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
public static string[] SplitLine(string input)
{
Regex lineSplit = new Regex("[0-9]\;$", RegexOptions.Compiled);
List<string> list = new List<string>();
string curr = null;
foreach (Match match in lineSplit.Matches(input))
{
curr = match.Value;
if (0 == curr.Length)
{
list.Add("");
}
list.Add(curr.TrimStart(';'));
}
return list.ToArray();
}
}
但是这不起作用(我什至不被允许执行任务)。
我以前从未使用过c#,所以一切对我来说都是新的。据我了解的代码,它搜索每一行以找到仅在一个“;”前面有数字的模式。最后,因此将找不到以“ ;;”开头的数字结尾的行(两个;)。 当有比赛时,一个“;”已添加。
请让我知道,我没有理解和做错的事情。
也许将脚本组件放在平面文件源之后也是错误的,因为添加了“;”不会导致换行,这就是我想要的。
答案 0 :(得分:1)
不一致的行定界符是错误的数据,并且在连接管理器或数据流中确实没有办法对此进行更正。修复数据流中的不良数据并不是SSIS的目标。最好的选择是执行以下两个操作之一:
从那里,您将能够在SSIS中正常处理文件。
更新1:
如果,唯一的问题是重复的定界符(;;),则读入该行并使用Replace(";;",";");
函数。如果您有多个重复的行分隔符或无效行尾定界符,则最好使用StringBuilder()
为您服务。有关使用StringBuilder()
的解决方案,请参见下面的网络链接。
https://stackoverflow.com/a/49949787/4630376
更新2:
我刚刚记得的一件事,您需要调整为仅处理双引号之外的那些字符,假设文件中存在双引号作为文本限定符。这很重要,因为如果没有它,您将删除引号内的所有字符,这可能是有效数据。
答案 1 :(得分:0)
我同意J Weezy创建脚本任务来更正不良数据。在脚本任务中,您可以使用正则表达式来处理“;”和“ ;;”问题。脚本任务可能是您处理“;”和“ ;;”问题的唯一方法。
虽然以下当前形式的代码不适用于您的情况,但可以将其更改为适合您的情况。我用它来处理text \ csv文件,以更正每行数据的格式问题。请注意,我是从Stackoverflow上的另一篇文章中得到的。
onerror