我在一個目錄中有許多文本文件,其中有一些由列表[6]分隔的選項卡。我使用「平面文件源」塊將其讀入SSIS包中。如果一個文件的列數多於所需的數字,或者任何列的數據缺失,我想拒絕這個文件。SSIS - 平面文件源中的固定列數
我已經做了一些測試與各種示例文件。每當我添加額外的列時,程序都會接受這些文件。當列數較少時,會引發錯誤。
但是,有沒有辦法指定文件必須有一定數量的列,並且數據必須存在於每列中?
我對SSIS沒有太多的經驗,所以我希望有任何建議。
謝謝
我在一個目錄中有許多文本文件,其中有一些由列表[6]分隔的選項卡。我使用「平面文件源」塊將其讀入SSIS包中。如果一個文件的列數多於所需的數字,或者任何列的數據缺失,我想拒絕這個文件。SSIS - 平面文件源中的固定列數
我已經做了一些測試與各種示例文件。每當我添加額外的列時,程序都會接受這些文件。當列數較少時,會引發錯誤。
但是,有沒有辦法指定文件必須有一定數量的列,並且數據必須存在於每列中?
我對SSIS沒有太多的經驗,所以我希望有任何建議。
謝謝
我會使用腳本任務來做到這一點。
您可以使用System.IO.StreamReader
來打開文件並讀取您的標題行,然後在生成的字符串上執行所需的任何驗證。
我也會在SSIS包中創建一個布爾變量,名爲'FileIsValid',我會寫(從腳本任務),如果條件滿足則爲真,如果不是,則爲False。然後,我將使用這個來指導使用優先約束的包流。
事情是這樣的:
public void Main()
{
System.IO.StreamReader reader = null;
try
{
Dts.Variables["User::FileIsValid"].Value = false;
reader = new System.IO.StreamReader(Dts.Variables["User::Filepath"].Value.ToString());
string header = reader.ReadLine();
if (header.Trim() == "Column1\tColumn2\tColumn3\tColumn4\tColumn5\tColumn6")
Dts.Variables["User::FileIsValid"].Value = true;
reader.Close();
reader.Dispose();
Dts.TaskResult = (int)ScriptResults.Success;
}
catch
{
if (reader != null)
{
reader.Close();
reader.Dispose();
}
throw;
}
}
至於檢查存在的所有列的數據,這是否需要爲每一行?
您可以繼續閱讀StreamReader
的行並使用正則表達式來檢查這樣的事情。
克里斯麥克擴展:
如果文件沒有標題,你可以做一個計數。
char[] delim = new char[] {'\t'};
if(header.Split(delim).Length() == 5)
...