Ssis 多行分隔符

Ssis 多行分隔符,ssis,delimiter,Ssis,Delimiter,如何在SSI中为平面文件连接定义多行分隔符? 例如,对于包含此字符串的文本文件: 任何时候都需要礼貌;粗鲁是不能容忍的 我想在使用之后有这两行;'和。用于行分隔符: 任何时候都需要礼貌 粗鲁是不能容忍的 对于源数据,我创建了一个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

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

任何时候都需要礼貌;粗鲁是不能容忍的

我想在使用之后有这两行;'用于行分隔符:

任何时候都需要礼貌

粗鲁是不能容忍的


对于源数据,我创建了一个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

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

在InputColumns选项卡上,检查InputRow并将其保留为只读,以便脚本可以访问该值。如果您可以将其切换为ReadWrite并修改传出值,那就太好了,但这不适用于这种类型的操作

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

在OutputSplit的输出列上,添加一个名为SplitRow DT_STR 8000的列。

在脚本转换中,您只需要关注ProcessInputRow方法。string类提供了一个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;
        }
    }
}
//
///我们必须使它成为一个异步脚本,因为一个输入行可以是多个输出行
/// 
/// 
公共覆盖无效Input0\u进程InputRow(Input0Buffer行)
{
string[]results=Row.InputRow.Split(新字符[]{';','..});
foreach(结果中的字符串行)
{
//如果希望缓冲区中有空字符串,请删除此行
如果(!string.IsNullOrEmpty(行))
{
OutputSplitBuffer.AddRow();
//您可能需要在线路上调用修剪操作
OutputSplitBuffer.SplitRow=行;
}
}
}
完成了所有这些,我按了F5,瞧,


这将是一个相当内存密集的包,具体取决于您在其中运行的数据量。我确信可以进行一些优化,但这应该足以让您继续。

那么您已经有了一个定义为换行符(\n)的行分隔符,并且还想在分号上拆分?数据流中是否只有一行,或者您是否需要复制列1-n,并将文明行和粗鲁行对折?@arz您的意思是使用
\r\n
?更新为关于文件布局的另一个问题。2或3个分隔符?分隔符的数量不是一个常数,可能是2、3或3以上。不使用脚本组件是否可以这样做?