2016-08-30 52 views
0

我有一個SSIS包,它有一個.csv文件作爲平面文件源。條件拆分根據ID將數據插入到各個SQL Server登臺表中。任何未成功插入的行都會重定向到錯誤.csv文件,每個ID一個。根據csv文件的行數移動文件

有了這些衆多的錯誤文件,我想對有多少行(除了標題行)進行評估。如果至少有一個數據錯誤行,這些行將通過發送電子郵件任務發送給源開發人員,否則將通過文件系統任務進行存檔。

我正在努力如何解決這個問題。我有一些想法,可以使用錯誤文件目錄中的Foreach循環容器循環並通過腳本任務執行行計數。但是,我不確定如何將單個文件名傳遞給腳本任務。此外,我不確定事後可以做有條件的電子郵件/文件系統任務移動。

在腳本任務方面,腳本任務的東西看起來像這樣(它是錯誤的),失敗的是它不會超過1並被歸檔,通過它被通過電子郵件發送,只是爲了某種想法。我對複雜的C#腳本頗爲新穎。

 public void Main() 
     { 
     string folderPath = Dts.Variables["User::errorDirectory"].Value.ToString(); 
     string archivePath = @"\\SERVER\placeholderfilepath\blah\blah"; 
     var FileNames = new List<string>(); 
     var FilePaths = new List<string>(); 

     DirectoryInfo directoryInfo = new DirectoryInfo(folderPath); 
     FileInfo[] files = directoryInfo.GetFiles(); 

     var lineCount = 0; 


     foreach (FileInfo fileInfo in files) 
     { 

      lineCount = File.ReadAllLines(fileInfo.FullName).Count(); 

      //MessageBox.Show(lineCount.ToString()); 

      if (lineCount == 1) 
      { 
       File.Move(folderPath, archivePath); 
      } 

     } 




     Dts.TaskResult = (int)ScriptResults.Success; 

     } 

經過幾個小時的搜索後,我找不到任何涵蓋此內容的內容,因此會感謝任何指針/文章。

在此先感謝。

回答

1

您可能會嘗試向將數據寫入.CSV的數據流添加行計數組件。行計數就會把行數的一些變量,然後你就會知道,如果有在.CSV

任何行,我可以看到這個問題在你的代碼

string folderPath = Dts.Variables["User::errorDirectory"].Value.ToString(); 
     string archivePath = @"\\SERVER\placeholderfilepath\blah\blah"; 
     var FileNames = new List<string>(); 
     var FilePaths = new List<string>(); 

     DirectoryInfo directoryInfo = new DirectoryInfo(folderPath); 
     FileInfo[] files = directoryInfo.GetFiles(); 

     var lineCount = 0; 


     foreach (FileInfo fileInfo in files) 
     { 

      lineCount = File.ReadAllLines(fileInfo.FullName).Count(); 

      //MessageBox.Show(lineCount.ToString()); 

      if (lineCount == 1) 
      { 
       File.Move(fileInfo.FullName, Path.Combine(archivePath, fileInfo.Name)); 
      } 

     } 

     Dts.TaskResult = (int)ScriptResults.Success; 
+0

我曾考慮過這一點,但我想知道是否可以通過腳本更有效地完成比設置大量行計數變量。將會有10個這樣的文件啓動,並且我預計這個數字會隨着時間的推移而增加,所以想要做出這個面向未來的預測。 – TJB

+0

是否考慮過對這些ID值的循環?在這種情況下,所有ID將重複使用相同的流程。或者你想發送一封包含所有錯誤.CSV的郵件? –

+0

我真正想要的是評估目錄中的每個文件。如果RowCount大於1,則將文件保留在那裏,否則將其移至歸檔文件夾。我想遍歷目錄中的每個文件,打開它,執行行計數來完成此操作。郵件任務只會選取尚未移動的文件,因此這不是該位的問題。我正在努力的是一些腳本來讀取文件名的每個包變量,對行進行計數並決定是否對其進行存檔。 – TJB

1

而不是ForEach循環來計算文件,只處理腳本任務中的所有內容。使用filesystemobject獲取文件夾中文件的集合,並使用集合的count屬性。

+0

感謝評論...然而,它是目錄中每個文件的行數,而不僅僅是文件的數量。 – TJB

+0

好吧,你仍然可以跳過foreach循環,並在腳本中做所有事情。或者,如果您想要將文件名從循環傳遞到腳本,則可以使用包變量。 –

+0

我還應該提到,這些文件每天都會生成,文件名每天都會動態更改(通過每個錯誤文件的包變量)。 – TJB