1

我有这个用于排序 csv 文件的代码。如何从读取和排序中跳过文件的第一行,因为第一行包含列的名称。该文件如下所示:

ID Name Surname Age Salary
1  John Asben   33  1000
2  Adam Smith   22  1200

代码是:

private void buttonSortSave_Click(object sender, EventArgs e)
{
    var sorted =
      File.ReadLines(@"C:\....dat.csv")
        .Select(line => new
        {
            SortKey = Int32.Parse(line.Split(',')[3]),
            Line = line
        })
        .OrderBy(x => x.SortKey)
        .Select(x => x.Line);
    File.WriteAllLines(@"C:\sorteddata.csv", sorted);
}
4

3 回答 3

7
File.ReadLines(@"C:\....dat.csv")
.Skip(1)
于 2013-05-28T20:17:07.510 回答
1

要扩展 Raphaël 的解决方案,您可以使用 Memoize 函数来保留标题行,但对其余行进行排序。Microsoft 的 Ix-Main nuget 包包含其他非常有用的扩展,或者您可以只使用 ReadAllLines() 或 ToArray():

var items = File.ReadLines(@"C:\....dat.csv").Memoize(2);

var sorted = items.Take(1)
    .Concat(items.Skip(1).OrderBy(line => Int32.Parse(line.Split(',')[3])));

File.WriteAllLines(@"C:\sorteddata.csv", sorted);
于 2013-05-28T20:29:15.710 回答
0

使用文件助手:

FileHelpers.CsvOptions options = new FileHelpers.CsvOptions("ImportRecord", ',', file);
options.HeaderLines = 0;        

FileHelpers.CsvEngine engine = new FileHelpers.CsvEngine(options);
//read header
engine.Options.IgnoreFirstLines = 0; 
DataTable header = engine.ReadStringAsDT(FileHelpers.CommonEngine.RawReadFirstLines(file, 1)); 
//read the rest of the data without the header
engine.Options.IgnoreFirstLines = 1;
DataTable data = engine.ReadFileAsDT(file); 
于 2013-05-28T20:22:25.597 回答