2009-10-16 52 views
1

「可變格式」我的意思是文本文件中的每一行都以表示記錄類型的單個字符代碼開始,並且每種記錄類型都有不同的格式。我相信這是一種相當常見的大型機數據導出方法。更糟糕的是記錄類型實際上是層次結構。SSIS - 導入可變格式文本文件

0ThisIsAFileHeader 
2ThisIsABatchHeader 
4ThisIsDetailData 
4ThisIsDetailData 
6ThisIsAMatchingBatchFooter 
8ThisIsAMatchingFileFooter 

0/8是頭/尾記錄(每一個自己的格式),2/6是子頭/分拖車記錄(也每一個自己的:在使用該代碼的關係如下格式),4表示實際數據或詳細記錄。

SQL Server 2008,Visual Studio.NET 2008.自定義腳本任務是導入此數據的唯一方法嗎?鑑於此,有人能夠指出我討論這樣做的資源嗎?導入固定寬度的文本文件非常簡單,但我不確定腳本任務落在控制流中的位置以及後續步驟如何使用這些數據。

回答

4

這可以在SSIS內完成,儘管你必須跳過一些箍環。關閉我的頭頂部這是一種方法:

  • 源文件應設置爲2列,第1個字符和其餘字符串。
  • 條件拆分動作基於第一個字符將行拆分爲單獨的工作流。
  • 數據轉換採取第二列並將其分割到適當的字段中的操作,必須對每種類型的線單獨進行並將其附加到相應的條件分割線上。
  • 應該爲每個條件分支配置目的地以適當地存儲/處理數據。

如果需要進一步的ETL工作來開始鏈接項目,我會將文件導入臨時表或永久臨時區域,並在提交最終結果之前執行更多轉換。

真正的麻煩在於數據是相關的,以及如何保持這種關係/之後推斷它。我想如果我必須把它放在一起,我會在數據流中使用一個腳本組件,每當它看到一個標題記錄時增加一個計數器,並將其輸出到流中。這樣每個記錄都會有一個識別號碼,可以用來將它們關聯起來。

這有點複雜,但問題可以解決。

+0

這正是我的BI團隊過去所做的。我建議還有任何不符合條件拆分條件的記錄轉到未定義的記錄表(基本上是一個文本斑點和安裝程序監視,以便在此表中記錄時通知您)。每個在藍月亮數據模式中的人都可以爲這些類型的導入進行更改,並且您需要知道它何時發生,因爲直到數據顯示在文件中才可能知道。 – 2009-10-16 23:47:28

1

也許SSIS有更好的方法來做到這一點,但是當我不得不在DTS中做這個任務時,這就是我所做的。

首先,我將數據帶入有兩列的登臺表(如果我覺得我需要一個自動生成的ID,那麼還有三個表)。一列是表示記錄類型的字符,一列是該行的所有其餘數據。

然後,我根據數據進行標準化表格分離,一直進行清理。

然後我導入到我的生產表。

1

如果我是你,那6個不同的字符代碼是唯一與特定數據集關聯的代碼,那麼我會使用Flat File Import組件導入它,然後在每個代碼上使用Case組件切換。我假設您希望維護層次結構,以便您可以使用Case拆分數據,然後插入它,然後再想要。

使用腳本組件導入數據通常是我的最後手段,但我真的很喜歡在文件(如您的情況)無法正確導入時使用腳本代碼在實際的平面文件導入之前格式化數據。我相信編寫一個格式化應用程序並使用它來格式化來自系統的任何文件比每次編寫自定義腳本導入都更有用。

1

我已經做了很多次這樣的事情,但我總是預處理數據來爲每行添加行號。之後,使用最大/最小值和行號比較來將表格連接在一起很容易。

但這是一種笨拙。如果我們使用條件拆分,SSIS本身是否可以獲得行號?或者我們可以使用遞增的整數鍵來代替行號,沒有條件會使它們失序的風險?