2013-04-15 54 views
0

我正在導入格式類似於報告的Excel文件 - 即某些列只爲其所屬的每組行填充一次,如:SSIS - 導入包含子標題列的文件(在某些行中省略)

CaseID |Date  |Code 
    157207 |   | 
      |8/1/2012 |64479 
      |8/1/2012 |Q9967 
      |8/1/2012 |99203 

我需要捕獲這些組頭中的一個(CaseID,在上面的例子中),並使用它用於隨後的行,其中該字段爲空,然後保存該我遇到的下一個值。 我已經加入一個變量(用戶:: CurrentCaseId)和腳本變換,用下面的代碼:

public class ScriptMain : UserComponent 
{ 
    string newCaseId; 

    public override void Input0_ProcessInputRow(Input0Buffer Row) 
    { 
     if (!Row.CaseIDName_IsNull && Row.CaseIDName.Length > 0) 
      newCaseId = Row.CaseIDName; 
     else 
      newCaseId = "DetailRow"; 
    } 

    public override void PostExecute() 
    { 
     base.PostExecute(); 
      if (newClaimNumber != "DetailRow") 
       Variables.CurrentCaseId = newCaseId; 
    } 

基本上,我想讀出的值存在時,並保存在該變量。我使用條件拆分來刪除只有CaseID的行,然後使用派生列將變量值放入新列以完成詳細信息行。 唉,該值始終爲空(在派生列之後放置數據查看器)。我修改了腳本,始終將該變量設置爲固定字符串 - 派生列仍爲空白。

這似乎是一個很好的計劃......我在MS論壇上收到了一些反饋,您不能在相同的數據流任務中設置變量值並使用其新值。如果是這樣,我能想到的唯一解決方案就是在存在時將CaseID寫出到表格中,並在缺席時將其讀回。我真的很討厭用數百萬行(多個Excel工作表)來做到這一點。任何更好的想法?

最佳, 斯科特

+0

對於SSIS之外的溶液,短Excel宏將準備用於導入該文件:) 「子CopyClaimNumber(DIM CurrentClaim作爲字符串 Sh1的= 「Sheet 1中」 LastRow1 =表(Sh1的).UsedRange.Rows.Count 如果C.Value <>「」Then CurrentClaim = Mid(C.Text,1,(InStr(1) ,C.Text,「/」,vbTextCompare) - 2)) Else C.Value = CurrentClaim End If Next C End Sub' – Scott

回答

0

這可以是你一個很好的起點。

  1. 我使用以下文件作爲源。它保存到C:\ TEMP \ 5.TXT
CaseID |Date  |Code 
157207 |   | 
     |8/1/2012 |64479 
     |8/1/2012 |Q9967 
     |8/1/2012 |99203 
157208 |   | 
     |9/1/2012 |77779 
     |9/2/2012 |R9967 
     |9/3/2012 |11203 
  1. 將一個DFT控制流表面上。
  2. 將腳本組件作爲源文件放在DFT上

    3.1。轉到輸入和輸出部分

    3.2。添加輸出。將其更名爲MyOutput。

    3.2.1 Add the following output columns - CaseID, Date, Code 
    3.2.1 The data types are four-byte unsigned integer [DT_UI4], string [DT_STR], string [DT_STR] 
    
  3. 現在轉到腳本//編輯腳本。把下面的代碼。確保

使用System.IO增加;

到命名空間區域。

public override void CreateNewOutputRows() 
{ 

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

    int iRowCount = 0; 
    string[] fields = null; 
    int iCaseID = 0; 
    string sDate = string.Empty; 
    string sCode = string.Empty; 

    foreach (string line in lines) 
    { 
     if (iRowCount == 0) 
     { 
      iRowCount++; 
     } 
     else 
     { 
      fields = line.Split('|'); 
      //trim the field values 
      for (int i = 0; i < fields.Length; i++) 
      { 
       fields[i] = fields[i].Trim(); 
      } 

      if (!fields[0].Equals(string.Empty)) 
      { 
       iCaseID = Convert.ToInt32(fields[0]); 
      } 
      else 
      { 
       MyOutputBuffer.AddRow(); 

       MyOutputBuffer.CaseID = iCaseID; 
       MyOutputBuffer.Date = fields[1]; 
       MyOutputBuffer.Code = fields[2]; 
      } 
     } 
    } 
} 

}

  1. 測試代碼:添加一個聯盟的所有組件的正下方,你把腳本組件。將腳本組件的輸出連接到Union All組件。放入數據查看器。

希望這應該對你有幫助。請告訴我們。我今天回答了一個類似的問題;請檢查一下。這可能有助於鞏固這一概念 - 恕我直言。

+0

謝謝。我沒有想過使用腳本組件作爲源,但顯然是由於批量處理數據而成爲SSIS解決方案的唯一途徑。 – Scott

相關問題