【发布时间】:2018-07-19 14:45:21
【问题描述】:
我在将平面文件导入 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 标准 DataType 读取是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#,所以一切对我来说都是新的。据我了解代码,它搜索每一行以找到只有一个“;”前面有数字的模式最后,因此它不会找到那些以“;;”后面的数字结尾的行(二 ;)。 当有匹配时,一个“;”已添加。
请告诉我,我不理解和做错了什么。
也许将脚本组件放在平面文件源之后也是错误的,因为添加了“;”不会导致新行,这是我想要的。
【问题讨论】:
标签: visual-studio ssis delimiter flat-file