2017-05-05 101 views
1

我正在接收來自目錄的所有.csv文件,從每個使用CSVhelper的文件中取出幾列,然後寫入新的.csv文件。但是,當我試圖接收文件時,它似乎只採取目錄中的最後一個文件,我無法理解爲什麼。我把文件中是這樣的:使用CSVhelper接收多個.csv文件

static void Main(string[] args) 
    { 
     string sourceDirectory = @"C:\Users\SourceDirectory"; 

     var csvFiles = Directory.EnumerateFiles(sourceDirectory, "*.csv", SearchOption.AllDirectories); 

     foreach (string currentFile in csvFiles) 
     { 
      readFile(currentFile); 
     } 
    } 

,然後執行這些文件中的變化,例如:

public static void readFile(string currentFile) 
    { 
     using (var sr = new StreamReader(currentFile)) 
     { 
      using (var sw = new StreamWriter(@"C:\Users\newFile.csv")) 
      { 
       var reader = new CsvReader(sr); 
       var writer = new CsvWriter(sw); 

       //CSVReader will now read the whole file into an enumerable 
       IEnumerable dataRecord = reader.GetRecords<dataRecord>().ToList(); 

       foreach (dataRecord record in dataRecord) 
       { 
        //Choose which data values you want to keep 
        writer.WriteField(record.info1); 
        writer.WriteField(record.info2); 
        writer.WriteField(record.info3); 

        //Moves the pointer onto the next record 
        writer.NextRecord(); 
       } 

我不明白爲什麼它不把所有的文件和更糊塗了至於爲什麼只採取最後?

+0

難道它會通過你的所有的源文件,但你的代碼是在結束它覆蓋每次輸出文件,所以只包含最後一個的輸出。 – Andy

回答

2

的StreamWriter的構造函數,它只有一個參數的文檔說

path參數可以是文件名,其中包括通用 命名約定(UNC)共享文件。如果文件存在,它將被覆蓋; 否則,會創建一個新文件。

因此,在每個循環中,您將覆蓋前一個C:\ Users \ newFile.csv,並且當前源文件的內容以加載的最後一個CSV文件的內容結尾。

如果要追加到同一個文件,你需要的constructor that takes a boolean to append

using (var sw = new StreamWriter(@"C:\Users\newFile.csv", true)) 
+1

完美,謝謝! – johnfish92

+0

希望你不介意我問一個問題。我正在閱讀的.csv文件有7個標題,但是我正在寫的一個我想要11個標題,其中一些與我的類dataRecord不同。這可能與CSVHelper?它給我一個錯誤,說頭不在類中,然後如果我把它添加到類中,它說它不在它正在讀取的文件中..這顯然不會是。 – johnfish92

+0

對不起,但我從來沒有使用CSVHelper庫。可能你最好的機會是發佈一個詳細說明問題的新問題 – Steve