由于不一致的分隔符

时间:2018-07-19 14:45:21

标签: visual-studio ssis delimiter flat-file

将平面文件导入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

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/49a764e7-1a6f-4a6f-9c92-2462ffa3add2/regarding-ssis-split-multi-value-column-into-multiple-records?forum=sqlintegrationservices

但是他们的问题不一样,因为他们具有复制的列值,并且我想要整行。

感谢您的帮助, ss

!!编辑尝试使用J Weezy和R M的答案:!!

我尝试创建脚本任务并遵循该解决方案。

在Visual Studio中,我使用脚本组件添加脚本任务,然后选择“转换”。在“输入列”下,选择全部。

此后,我将平面文件源定向到脚本组件并运行代码。这样运行脚本(脚本组件不执行任何操作)即可。

No script in script component

然后在脚本组件中输入“编辑脚本”,然后在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#,所以一切对我来说都是新的。据我了解的代码,它搜索每一行以找到仅在一个“;”前面有数字的模式。最后,因此将找不到以“ ;;”开头的数字结尾的行(两个;)。 当有比赛时,一个“;”已添加。

请让我知道,我没有理解和做错的事情。

也许将脚本组件放在平面文件源之后也是错误的,因为添加了“;”不会导致换行,这就是我想要的。

2 个答案:

答案 0 :(得分:1)

不一致的行定界符是错误的数据,并且在连接管理器或数据流中确实没有办法对此进行更正。修复数据流中的不良数据并不是SSIS的目标。最好的选择是执行以下两个操作之一:

  1. 与数据源提供商合作,最终解决问题
  2. 创建脚本任务以首先修改文件以更正错误数据

从那里,您将能够在SSIS中正常处理文件。

更新1:

如果,唯一的问题是重复的定界符(;;),则读入该行并使用Replace(";;",";");函数。如果您有多个重复的行分隔符或无效行尾定界符,则最好使用StringBuilder()为您服务。有关使用StringBuilder()的解决方案,请参见下面的网络链接。

https://stackoverflow.com/a/49949787/4630376

更新2:

我刚刚记得的一件事,您需要调整为仅处理双引号之外的那些字符,假设文件中存在双引号作为文本限定符。这很重要,因为如果没有它,您将删除引号内的所有字符,这可能是有效数据。

答案 1 :(得分:0)

我同意J Weezy创建脚本任务来更正不良数据。在脚本任务中,您可以使用正则表达式来处理“;”和“ ;;”问题。脚本任务可能是您处理“;”和“ ;;”问题的唯一方法。

虽然以下当前形式的代码不适用于您的情况,但可以将其更改为适合您的情况。我用它来处理text \ csv文件,以更正每行数据的格式问题。请注意,我是从Stackoverflow上的另一篇文章中得到的。

onerror