首页 > 解决方案 > 将平面文件导入 SSIS 会出现问题,因为分隔符不一致

问题描述

我在将平面文件导入 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,并在高级编辑器中将长度更改为非常大的长度。

Visual Studio 中的高级编辑器是否已更改长度

所以问题是,我如何在 SSIS 和 Visual Studio Community 中将某些单元格中的值分隔在一列中,并将它们拆分为一个全新的行(使用已经定义的列变量)。

我已尝试手动查找所有出现错误的情况,并在 .csv 文件中进行了更改。在此 SSIS 工作之后。然而,这不是一个持久的解决方案,因为我每个月都会收到一个新文件。

我尝试阅读以下建议:

在 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= sql集成服务

但他们的问题不一样,因为他们有一个复制的列值,我想要一个全新的行。

谢谢你的帮助,ss

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

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

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

在此之后,我将平面文件源定向到脚本组件并运行代码。像这样运行脚本(脚本组件不做任何事情)可以工作。

脚本组件中没有脚本

然后我在脚本组件中输入“编辑脚本”,然后在public override void Input0_ProcessInputRow(Input0Buffer Row)我下输入(使用 RM 的帮助):

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-studiossisdelimiterflat-file

解决方案


不一致的行分隔符是错误数据,在连接管理器或数据流中确实没有办法纠正这个问题。修复数据流中的错误数据并不是 SSIS 的设计目的。您最好的选择是执行以下两项操作之一:

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

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

更新1:

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

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

更新 2:

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


推荐阅读