2013-05-28 72 views
1

我有这个代码用于排序一个CSV文件。如何从阅读和排序中跳过第一行文件,因为第一行具有列的名称。该文件看起来像:如何跳过阅读和排序的第一行C#

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); 
} 
+2

使用['跳过(1)'](http://msdn.microsoft .com/en-us/library/bb358985.aspx) – vcsjones

+0

不需要Select()。OrderBy()。Select()'你有。 'OrderBy'方法带有一个选择器。使用它来获得适当的值进行排序。然后可以删除其他两个'Select'方法。 – Servy

回答

7
File.ReadLines(@"C:\....dat.csv") 
.Skip(1) 
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); 
1

为了扩大对拉斐尔的解决方案,你可以使用一个memoize的功能保留标题行但对其余的进行排序。微软的IX-主要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); 
+0

操作系统将缓存该文件的页面,所以你可以做到这一点,而不会记住它,这是不可能的,你会看到任何问题。请注意,如果文件非常小,则使用“ReadAllLines”或“ToArray”很容易导致问题。 – Servy

+0

'OrderBy'在内部具有'ToArray'的存储开销,所以当额外的'ToArray'肯定会增加内存使用量时,它可能不会那么糟糕,除非它是一个巨大的文件。请记住字符串不会被复制,因此它不会成为100%的开销。虽然'Memoize'会删除所有额外的开销,但仍然不需要两次读取文件,这就是为什么我通过'ToArray'建议它。 –