2017-10-16 118 views
0

我已經構建了一個SSIS包,可以將多個分隔文本文件加載到SQL數據庫中。其中一個文件通常包含行空格,它打破了設置平面文件源和映射到ado.net目標的標準數據流任務,因爲它認爲它在到達換行符時處於新行。發送文件的供應商不希望在沒有任何編輯的情況下發送文件,並且此時不能執行XML。有沒有什麼辦法解決這一問題?我正在考慮編寫一個小的vb.net程序來糾正這些文件,以便它們可以在SSIS包中工作,但不知道如何編寫該邏輯。該文件有5列,前2個是大整數,並且總是包含一些長整型ID,然後有一個小文本列,它只包含一個短詞,然後是一個日期,然後是導致問題的長評論字段。註釋字段有時是空白的(沒關係),問題是有換行符的行。我不知道評論中有多少換行符,有的沒有,有的可能有幾個,甚至連續多個換行符,所以想知道這是否可能。如何加載具有有時包含換行符的列的管道(|)分隔文本文件?

5787626 | 6547599 |覈准| 1/10/2017 |申請費豁免覈准批准 5443221 | 7742812 |活躍| 11/5/2013 | 3430962 | 7643957 |重新計劃| 5/25/2016 |修訂的條款和條件被駁回 申請人有30天提交延期的文書工作。 34433624 | 7673715 |拒絕| 1/24/2017 | 34113575 | 7653748 |活動| 1/8/2014 |新條款已被授予。

示例文件格式。

Sample File Format

+0

我已經做了類似的事情。從我的方法中獲取指導​​。我創建了一個包含30列的臨時表(我的管道分隔列固定爲MAX 30)。現在閱讀管道隔離的列並將它們寫入txt文件。然後再次從文本中讀取並將它們放入暫存表中。寫入後刪除txt文件。希望這是有道理的? –

+0

我不明白,如果我將文件加載到臨時表中,那麼我剩下的臨時表的數據列中沒有任何意義。例如,這將使我在諸如「申請人有30天」之類的文本中只能包含大整數值的列。 –

+0

你在找什麼樣的輸出?我想我誤解了你的輸出要求。 –

回答

0

只要有可以編程/預測邏輯,這將是可能的。

我會使用腳本組件作爲源代碼來執行它,這意味着您在處理它之前不需要重寫該文件。它也提供了很大的靈活性,例如,你可以在遍歷多個文件中的行存儲在變量值等

我最近發佈的另一種答案是對如何去這個問題很多的細節:SSIS import a Flat File to SQL with the first row as header and last row as a total

的變量持有的值,直到該行已準備好一個例子寫成: -

在這個例子中我寫三列,ID1,ID2和評論。該文件是這樣的:

1|2|Comment1 
Comment2 
4|5|Comment3 
Comment4 
Comment5 
6|7|Comment6 

腳本組件包含以下方法。

public override void CreateNewOutputRows() 
{ 
    System.IO.StreamReader reader = null; 

    try 
    { 
     bool readFirstLine = false; 
     int id1 = 0; 
     int id2 = 0; 
     string comments = null; 

     reader = new System.IO.StreamReader(Variables.FilePath); // this refers to a package variable that contains the file path 

     while (!reader.EndOfStream) 
     { 
      string line = reader.ReadLine(); 

      if (line.Contains("|")) 
      { 
       if (readFirstLine) 
       { 
        Output0Buffer.AddRow(); 

        Output0Buffer.ID1 = id1; 
        Output0Buffer.ID2 = id2; 
        Output0Buffer.Comments = comments; 
       } 
       else 
       { 
        readFirstLine = true; 
       } 

       string[] fields = line.Split('|'); 

       id1 = Convert.ToInt32(fields[0]); 
       id2 = Convert.ToInt32(fields[1]); 
       comments = fields[2]; 
      } 
      else 
      { 
       comments += " " + line; 
      } 

      if (reader.EndOfStream) 
      { 
       Output0Buffer.AddRow(); 

       Output0Buffer.ID1 = id1; 
       Output0Buffer.ID2 = id2; 
       Output0Buffer.Comments = comments; 
      } 
     } 
    } 
    catch 
    { 
     if (reader != null) 
     { 
      reader.Close(); 
      reader.Dispose(); 
     } 

     throw; 
    } 
} 

結果集是:

ID1 ID2 Comments 
=== === ======== 
1  2  Comment1 Comment2 
4  5  Comment3 Comment4 Comment5 
6  7  Comment6 
+0

由於字段中數字/字符的長度不是固定長度,因此我無法使用子字符串,甚至無法將(|)字符拆分爲數組,因爲通常最後的註釋字段爲空,並且它讀取在評論欄中下一行的第一行。 –

+0

你可以在你的邏輯中做一些事情,如果一行不包含管道,只需將該字符串添加到前一行的註釋字段的末尾?您可以爲每個字段使用變量,並且只有在知道完成後才創建行,即讀取包含管道的新行。 –

+0

是的,這聽起來像一個好主意,但不知道該怎麼做,你回去並追加到前一行。 –

相關問題