2017-05-05 69 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