2012-11-13 40 views
3

我正在使用大量源創建平面文件作爲源的數據倉庫項目,我們正在使用SSIS將它們加載到我們的登臺表中,目前我們正在使用平面文件源組件。SSIS平面文件 - 如何處理文件版本/世代

但是,過了一段時間,我們需要在其中一個文件中添加一列,並從文件規範更改的日期開始添加該額外的列。這個練習發生得非常頻繁,隨着時間的推移積累了相當多的版本。

根據我可以在這裏找到的答案以及互聯網上的其他方法來處理這種情況似乎是在這個版本的新的獨立數據流中設置一個新的平面文件源,舊文件的ETL過程的可運行性。 方法這裏概述例如:SSIS pkg with flat-file connection with fewer columns will fail

在我們特定的設置,附加欄始終附加列(從來沒有刪除舊的列),也爲合理的理由,如果我們繼續重新運行性能的新列不能mandantory爲他們單獨的數據流中的舊文件。

我不認爲一次又一次處理同一組列的重複數據流的方法對於我們的數據倉庫項目來說是一個很好的答案,我會優先選擇一個採用最後一個文件的源組件版本並且能夠將列標記爲「非mandadory」並且如果它們丟失則提供空值。

是否有人知道SSIS平面文件組件在處理舊文件版本時更靈活或者針對此問題有更好的解決方案? 我假設這樣一個組件需要以命名列的方式來處理文件,而不是現有的從左到右的方法?

歡迎任何想法或建議!

+0

平面文件沒有版本,您可以獲得新版本(不可重用)的唯一方法是比較新舊平面文件的元數據。說起來容易做起來難。 – rvphx

回答

0

處理(通過單獨的數據流)時,以下內容將會失去效率,但會爲您提供在單個數據流中處理多種文件類型的靈活性。

通過只指定行分隔符,您可以將平面文件連接安排到返回行而非單個列。將它連接到一個平面文件源組件,它將每行輸出一個列。我們現在有一行代表您知道的許多文件類型之一 - 下一步是確定您擁有哪種文件類型。

使用腳本組件從平面文件類型中獲取輸出。傳入單個列並傳遞所有可能列的超集。我們已經丟失了通常從文件源中閃爍的元數據,因此您需要在腳本組件輸出類型中構建列名稱/類型/大小。

在腳本組件中,傳遞行並將其分解爲其組成列。您必須執行模式匹配(可能使用RegularExpression.Regex.Match)來確定新列何時啓動。希望該文件格式良好,可以幫助您 - 防止文本列中的引號和逗號。

您現在可以通過確定您擁有的列數和缺省列來訪問文件類型。設置行的輸出列以傳遞組成部分。您可能需要附加一個新列以記錄輸出的文件類型。

該進程的其餘部分應該能夠使用單個數據流加載表,因爲您已經爲腳本中的所有文件類型提供了服務。

我不會建議你輕鬆地執行上述操作。當你必須對所有的列/類型等進行編碼時,SSIS的好處有所減少,但是它會爲你提供一個數據流來處理每個文件版本,並且可以在新列傳遞時擴展。