使用标头c#拆分CSV文件

时间:2016-09-29 11:06:30

标签: c# linq csv

我需要通过源字段拆分大型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,Ref,Title,Initials,Forename,Surname,File_Source

2 个答案:

答案 0 :(得分:2)

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

我个人更喜欢使用CSVHelper - 它适用于经典的.NET和.NET Core:

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 
    }   
}

答案 1 :(得分: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文件作为单纯的(字符串)字符串处理。您必须使用引用和多行值来遇到麻烦。