Sql-Server

導入具有不同可用標題的每日 csv

  • September 29, 2020

我每天都會收到來自外部公司的 csv,它為我們收集回饋。

無用的 csv 標題各不相同。可以有任何標題組合。例如:

第1天:標題1,標題2,標題3,標題4,標題5

第2天:標題1,標題2,標題4,標題6

第3天:標題1,標題2,標題7,標題8

第4天:標題1,標題2,標題3,標題4,標題5

我們有 18 個月的積壓文件(直到現在還沒有人對這些數據做任何事情),到目前為止,我發現了 22 種不同的組合……

我知道所有潛在的標題是什麼,所以我可以擁有一個包含所有適當列的 SQL 表,但我正在努力處理導入的差異。

有沒有辦法在 SSIS 中處理這個問題?我看過 bcp 和 openrowset 但我似乎無法讓它工作。

由於每天都會收到此文件,因此我需要一個 sql 作業,將它們導入我的表以進行報告。我只能創建一個將導入固定平面文件的 SSIS 包,但我需要它是動態的。最壞的情況是擁有 22+ 個不同的 SSIS 包並為給定的可用標題執行特定的 1,但是我需要一種自動讀取 csv 結構的方法來決定使用哪個包。

我迷路了,所以有人有方向嗎?

SQL 2016 (13.0.5622.0)

非常感謝

考慮一個包含兩個不同文件的簡化場景,每個文件包含不同的數據子集。

abc.csv:

a,b,c
1,a,a
2,b,b
3,c,c
4,d,d

abd.csv:

a,b,d
1,a,1
4,d,4
5,e,5
6,f,6

現在,我們可以使用 PowerShell 將文件、Select列導入已知的、一致的數字和順序,然後將其導出回帶有可預測文件的 csv:

Import-Csv abc.csv | Select a,b,c,d,e,f,g | Export-Csv abc_cleansed.csv -NoTypeInformation
Import-Csv abd.csv | Select a,b,c,d,e,f,g | Export-Csv abd_cleansed.csv -NoTypeInformation

這將生成兩個具有通用、可預測文件格式的新文件。

abc_cleansed.csv:

"a","b","c","d","e","f","g"
"1","a","a",,,,
"2","b","b",,,,
"3","c","c",,,,
"4","d","d",,,,

abd_cleansed.csv:

"a","b","c","d","e","f","g"
"1","a",,"1",,,
"4","d",,"4",,,
"5","e",,"5",,,
"6","f",,"6",,,

注意:我在最初的 csv 文件中省略了雙引號,PowerShell 也將它們添加到其中。您可以刪除它們,但恕我直言,這絕對是數據質量的有益功能。

現在,您可以簡單地建構一個數據管道,在其中獲取輸入文件,進行轉換以清理格式,然後選擇這些清理後的文件以導入它們。根據您的流程,您可以在單個 SSIS 包中完成所有這些操作,或者建構單獨的數據清理/數據導入流程。

引用自:https://dba.stackexchange.com/questions/276255