2016-09-29 48 views
1

我需要通过源字段拆分大型CSV文件并将导出文件的名称命名为源字段。带头c拆分CSV文件#

我的代码有效,但唯一不起作用的是我需要拆分文件从原始文件中获取标题行。

任何帮助表示赞赏。谢谢。

var splitQuery = from line in File.ReadLines(@"C:\test\test1.csv") 
      let source = line.Split(',').Last() 
      group line by source into outputs 
      select outputs; 

foreach (var output in splitQuery) 
{ 
    File.WriteAllLines(@"C:\test\" + output.Key + ".csv", output); 
} 

林不知道如何添加CSV的片段,但香港专业教育学院把报头字段的片段,希望这有助于

ID,编号,名称,英文缩写,名,姓,File_Source

+0

确实'test1.csv'在该文件的第一行头? –

+2

你能提供一个CSV文件的小片段样本,所以我们知道我们正在使用什么? –

+0

请注意,CSV解析的这种实现是容易出错的。尽管CSV格式不是标准,但包含逗号的值通常会引用(使用双引号)以避免将逗号视为字段分隔符。有关现场处理的详细信息,您可能需要查阅[RFC4180](https://www.ietf.org/rfc/rfc4180.txt)。 –

回答

1

只需第一读取头行:

var fileLinesIterator = File.ReadLines(...); 

string headerLine = fileLinesIterator.Take(1); 

然后,它预先准备的每一个输出:

var splitQuery = from line in fileLinesIterator 

// ... 


    File.WriteAllLines(@"C:\test\" + output.Key + ".csv", headerLine + "\r\n" + output); 

但除此之外,您不希望将CSV文件作为单纯的字符串处理。你肯定会遇到带引号和多行值的麻烦。

+1

不要忘记在读取记录时跳过(1)'。 ;) –

+0

谢谢大家的帮助:-) – user3206687

2

我强烈建议使用专门的库来解析处理第一行作为标题和其他所有内容的CSV文件。 CSV格式并不简单,因为它可能是第一眼看到的 - 例如,值可能在引号(“值”)中,并且引号可能会在值内部转义。

我个人更喜欢使用CSVHelper - 它既经典.NET和.NET的核心是合适的:

using (var fileRdr = new StreamReader(@"C:\test\test1.csv")) { 
    var csvRdr = new CsvReader(fileRdr, 
         new CsvConfiguration() { HasHeaderRecord = true }); 
    while(csvRdr.Read()) 
    { 
     // list of csv headers 
     var csvFields = csvRdr.FieldHeaders 

     // get individual value by field name 
     var sourceVal = csvRdr.GetField<string>("File_Source"); 

     // perform your data transformation logic here 
    } 
}