多行分隔符

时间:2011-10-31 05:17:08

标签: ssis delimiter

如何在SSIS中为平面文件连接定义多行分隔符? 例如,对于包含此字符串的文本文件:

  

任何时候都需要文明;粗鲁是不能容忍的。

我希望在使用';''。'进行行分隔后使用这两行:

  

始终需要文明

     

粗鲁无法容忍

1 个答案:

答案 0 :(得分:3)

对于源数据,我创建了一个3行文件

Civility is required at all times; rudeness will not be tolerated.
The quick brown fox jumped over the lazy dogs.
I am but a single row with no delimiter beyond the carriage return

我在下面采用的一般方法是使用格式为Ragged Right的平面文件连接管理器,我的标题行分隔符为{CR} {LF}。我定义了一列,InputRow为String 8000.YMMV

在我的数据流中,在平面文件源之后,我添加了一个脚本组件作为名为Split Rows的数据转换。

data flow

在Input Columns选项卡上,检查InputRow并将其保留为ReadOnly,以便脚本可以访问该值。如果您可以将其切换到ReadWrite并修改传出值,那将是很好的,但这不适用于此类操作。

默认情况下,脚本任务是同步组件,这意味着行和行之间存在1:1的关系。这不符合您的需求,因此您需要将其切换到异步模式。我将Output 0重命名为OutputSplit,并将SynchronousInput的值从“Input 0(16)”更改为None。您对16的价值可能会有所不同。

Script to Async mode

在OutputSplit的输出列上,添加名称为SplitRow DT_STR 8000的列。 output column definition

在脚本转换中,您只需要关注ProcessInputRow方法。字符串类提供了一种split方法,该方法获取将用作拆分器的字符值数组。目前,它在下面的数组初始化程序中进行了硬编码,但它可以很容易地定义为变量并传递给脚本。这留给了海报。

/// <summary>
/// we have to make this an async script as 1 input row can be many output rows
/// </summary>
/// <param name="Row"></param>
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    string[] results = Row.InputRow.Split(new char[]{';', '.'});
    foreach (string line in results)
    {
        // Remove this line if it is desirable to have empty strings in the buffer
        if (!string.IsNullOrEmpty(line))
        {
            OutputSplitBuffer.AddRow();
            // You might want to call trim operations on the line
            OutputSplitBuffer.SplitRow = line;
        }
    }
}

完成所有这些后,我击中了F5,瞧, Data viewer

这将是一个相当占用内存的程序包,具体取决于您运行的数据量。我确信可以进行优化,但这足以让你前进。