【问题标题】:Importing flat file into SSIS gives problems because non-consistent deliminater将平面文件导入 SSIS 会出现问题,因为分隔符不一致
【发布时间】: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

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 中,我使用脚本组件添加脚本任务并选择“转换”。在输入列下,我选择全部。

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

然后我在脚本组件中输入“编辑脚本”,并在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


    【解决方案1】:

    不一致的行分隔符是错误数据,无论是在连接管理器还是数据流中,实际上都无法纠正此问题。修复数据流中的错误数据并不是 SSIS 的设计目的。最好的选择是执行以下两项之一:

    1. 与数据源提供商一起解决问题
    2. 创建脚本任务先修改文件以纠正不良数据

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

    更新 1:

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

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

    更新 2:

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

    【讨论】:

    • 感谢您的回答。我尝试过创建脚本任务,但没有成功。我已经更新了问题,如果你有任何 cmets,请告诉我。
    【解决方案2】:

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

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

        public static string[] SplitLine(string input)
        {
            Regex lineSplit = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", 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();
        }
    

    【讨论】:

    • 感谢您的回答。我尝试过创建脚本任务,但没有成功。我已经更新了问题,如果你有任何 cmets,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2023-03-18
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多