2013-04-16 148 views
0

我有一個文本文件的列分隔符爲| (管道)和行分隔符作爲CRLF(新行字符)。輸出是一個SQL表。在文件SSIS不讀取行和列分隔符

  1. 數據 - :| 如果我在文件中的數據有多個管道()以上CRLF字符,那麼我的連接管理器的內容如下。以正確的格式。然後表格中的輸出是正確的。

    [Global Unique Identifier]|[KPI Name]|[KPI Description]|[Process Impacted]| 
    [Objective]|[Strategy ID]|[KPI Category]|[KPI Measure Type] 
    A26|name|Desc|TPI|YYY|12|CAT|MT 
    A27|name|Desc|TPI|YYY|12|CAT|MT 
    A28|name|Desc|TPI|YYY|12|CAT|MT 
    
  2. 數據與在第二行多個列分隔符文件,如下

    A26|name|Desc|TPI|YYY|12|CAT|MT 
    A27|name|Desc|TPI|YYY|12|CAT|MT||||||||| 
    A28|name|Desc|TPI|YYY|12|CAT|MT 
    

    在文件的輸出也如上述。即第二排最後一列的所有管線也被視爲數據。

  3. 文件中的數據如下。即在第一行只有一列,我們不會給其他列分隔符並給出行分隔符。

    A26 
    A27|name|Desc|TPI|YYY|12|CAT|MT 
    A28|name|Desc|TPI|YYY|12|CAT|MT 
    

然後在文件中的輸出如下所示。我們將第一列合併到第二行的第一列中。

A26 A27|name|Desc|TPI|YYY|12|CAT|MT 
A28|name|Desc|TPI|YYY|12|CAT|MT 

SSIS期望正確的分隔符,只有這樣它才能給出正確的輸出。否則輸出表中的數據不正確。 這可以以任何方式處理嗎?

如果對此問題有任何幫助,我將非常感激。

+0

'附加在這封電子郵件嗎?? ?? – praveen

+0

@praveen請現在檢查它的一個錯字:) – shiv455

+0

AFAIK在沒有適當的'delimeters'的情況下,SSIS無法讀取行值。您需要在C#或VB中推出自己的解析器,然後在'Script中讀取單獨的行組件' – praveen

回答

1

這對你來說可能是一個很好的起點。

  1. 我使用以下文件作爲源。它保存到C:\ TEMP \ 1.TXT

[全局唯一標識符] | [KPI名稱] | [KPI說明] | [進程 埋伏] | [目的] |策略ID] | [KPI分類] | [KPI測量類型]

A26|name1|Desc|TPI|YYY|12|CAT|MT 
A27|name2|Desc|TPI|YYY|12|CAT|MT 
A28|name3|Desc|TPI|YYY|12|CAT|MT 
B26|name4|Desc|TPI|YYY|12|CAT|MT 
B27|name5|Desc|TPI|YYY|12|CAT|MT||||||||| 
B28|name6|Desc|TPI|YYY|12|CAT|MT 
C26 
C27|name7|Desc|TPI|YYY|12|CAT|MT 
C28|name8|Desc|TPI|YYY|12|CAT|MT 
  1. 將一個DFT控制流表面上。
  2. 將腳本組件作爲源文件放在DFT上

    3.1。轉到輸入和輸出部分

    3.2。添加輸出。將其命名爲GoodRow。

    3.2.1 Add the following output columns - GUID, KPIN, KPID, PI, Obj, SID, KPIC, KPIMT 
    

    3.3添加另一個輸出。將其命名爲BadRow。 3.3.1只添加一個輸出列:AllFields

  3. 現在轉到腳本//編輯腳本。把下面的代碼。請務必添加

using System.IO;

到命名空間區域。

public override void CreateNewOutputRows() 
{ 

    string[] lines = File.ReadAllLines(@"C:\temp\1.txt"); 

    int iRowCount = 0; 
    int iFieldCountHeader = 0; 
    string[] fields = null; 


    foreach (string line in lines) 
    { 
     if (iRowCount == 0) 
     { 
      iFieldCountHeader = line.Split('|').Length; 
      iRowCount++; 
     } 
     else 
     { 
      fields = line.Split('|'); 

      if (fields.Length == iFieldCountHeader) // good row 
      { 
       GoodRowBuffer.AddRow(); 

       GoodRowBuffer.GUID = fields[0]; 
       GoodRowBuffer.KPIN = fields[1]; 
       GoodRowBuffer.KPID = fields[2]; 
       GoodRowBuffer.PI = fields[3]; 
       GoodRowBuffer.Obj = fields[4]; 
       GoodRowBuffer.SID = fields[5]; 
       GoodRowBuffer.KPIC = fields[6]; 
       GoodRowBuffer.KPIMT = fields[7]; 
      } 
      else // bad row 
      { 
       BadRowBuffer.AddRow(); 

       BadRowBuffer.AllFields = line; 
      } 

     } 
    } 
} 
  1. 測試代碼:正下方,你把腳本組件..名稱作爲一個和GoodRows其他如BadRows中添加兩個聯盟的所有組件。將Script組件的兩個輸出連接到這些Union All組件。放入數據查看器。

希望這應該對你有幫助。請告訴我們。

PS:當您將腳本組件添加爲源時,會有一個默認輸出。刪除它,然後創建上面提到的兩個輸出。我知道你會做到這一點,但只是爲了確保...