我會在評論中寫這篇文章,但你知道我是使用多年後的新人。無論如何,只有具有冗餘數據流的Checksum行存在條件的選項1可能是最直接的方法,並且看到您的數據集列受限制可能是創建和維護最快的方法。對於這種方法,你可以放入一個Foreach循環容器來設置它來枚舉文件。添加一個變量來測試校驗和是否存在。添加一個c#腳本任務來測試校驗和並填充變量。然後添加2個數據流任務1來處理一種格式,另一種格式。它只會是4個組件(FileConnection,Dataflow,源,目標)的重複。然後對於優先約束編輯器(雙擊綠色箭頭)更改以通過Expression中的表達式和約束進行求值,根據正在饋送哪個數據流,只需選擇變量或!變量(相反)。這是假設你沒有首先將同一個數據流任務中的所有2000多個文件與工會等結合起來,那麼你將會陷入癱瘓。對於@Shiva回答肯定有很多交叉,但是我沒有看到需要對工會進行有條件的拆分所有如果你要去一個臨時表。
在不同的音符,如果你真的不想要的數據流任務等冗餘沒有必要運行SSIS包之前做的PowerShell腳本。你可以創建一個C#腳本在包中正確執行。例如,我遇到了一個問題,那就是我必須導入的數據源的行結尾不一致。所以我有一個c#腳本來標準化我的數據流任務之前保存文件的行尾。您可以將文件規範化爲ssis包中的一個結構,但是它會在您指出時需要額外的系統資源,但是它將在文件已被加載到內存/處理的時間。
@xpil,15是不同的類型是不是在原來的問題。那麼我可能會做2件事中的1件。首先實現你的想法#2,但在SSIS腳本中。所以我會通過system.file.io操作去除不需要的行。然後,我會構建出所有不同的類型,並在腳本中設置一個變量,以通過不同的dft來告訴您哪種類型是或是否失敗。或者我實際上只是腳本的整個操作,我可能會或可能不會使用SSIS,但我只是有一個system.file.io來加載文件檢測存在和類型,然後簡單地使用SQLBulkCopy把它放到表中,然後寧可比創建DFT更省時。儘管如果文件大小隻有幾百MB,你仍然可能想要去DFT路線。以下是我編寫的一個SSIS腳本任務的一些片段,當然您可能需要根據自己的目的進行修改。
如果要去修理文件和DFT路線。
string contents = File.ReadAllText(_WFRFullPath);
contents = Regex.Replace(contents, @"\r\n?|\n", crlf);
File.WriteAllText(_SSISWorkspaceFullPath, contents);
通過正則表達式寫入文件將文件內容修復回新位置。
如果通過腳本路徑加載,則只需將其讀取到數據表中,然後可能按列名或數據類型測試格式。然後加載它。
SqlConnection sqlConnection = new SqlConnection(sqlConnectionString);
sqlConnection.Open();
SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnection);
bulkCopy.DestinationTableName = _stagingTableName;
foreach (DataColumn col in _jobRecDT.Columns)
{
//System.Windows.Forms.MessageBox.Show(col.ColumnName);
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
bulkCopy.WriteToServer(_jobRecDT);
sqlConnection.Close();
注意,我沒有它了手的代碼,但如果你有大量的文件,你可以真正實現一個流讀取器和塊中的文件和bulkcopy起來。
也許包括第一列的條件拆分放棄頭和Checksum將爲您工作。 – vercelli
那麼校驗和具有不同的列結構(比實際的列/數據)。我不明白條件分割對此有何幫助。 –
但是,如果你跳過第一行,你將擺脫CHECKSUM,對吧?然後,你應該放棄條件拆分上的剩餘頭文件(我猜頭文件的結構與數據的結構相同) – vercelli