2011-10-31 79 views
1

如何定义多行分隔符在SSIS一个平面文件连接? 例如用于包含该字符串的文本文件:多行分隔符

文明需要在所有时间;粗鲁不会被容忍。

我想有使用在此之后的两行“;”'。'用于行定界符:

文明需要在所有时间

粗鲁将不会容忍

+0

因此,你已经有一个行定界符像一个换行符(\ n)定义,你想也分裂在一个分号?数据流中只有一行,还是需要复制列1-n,并将Civility行和Rudeness行加倍? – billinkc

+0

@arz你的意思是使用';'和'\ r \ n'作为行分隔符吗? –

回答

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

在输入列选项卡,选中InputRow并把它作为只读因此脚本可以访问值。如果您可以将其切换到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方法有关。字符串类提供了一个拆分方法,它接收一组可用作拆分器的字符值。目前,它在数组初始化器中被硬编码,但它可以很容易地被定义为一个变量并传递到脚本中。这是留给海报的练习。

/// <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

这将取决于你经过多少数据运行是一个相当内存密集型包。我确信有人可以做出优化,但这应该足以让你走。

+0

只有一列。 – ARZ

+0

更新了关于文件布局的一个问题。 2或3个分隔符? – billinkc

+0

分隔符的数量不是一个常数,可能是2,3或多于3. – ARZ