2011-10-31 76 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