2014-10-10 74 views
0

我的csv文件有14列和~800.000行。我必須按照第10欄排序,然後按第3欄排序。 我使用下面的代碼,但種種僅10列如何用c中的兩列對csv文件進行排序#

  string filePath = "D:\\csv.csv"; 

      string[] lines = File.ReadAllLines(filePath, Encoding.Default); 

      var data = lines.Skip(1); 
      var sorted = data.Select(line => new 
      { 
       SortKey = Int32.Parse(line.Split(';')[9]), 
       Line = line 

      } 
      ).OrderBy(x => x.SortKey).Select(x => x.Line); 
      File.WriteAllLines("D:\\sortedCsv.csv", lines.Take(1).Concat(sorted), Encoding.Default); 

我的CSV喜歡

  • COL1; col2; col3; ......; col10; ...
  • abc; fds; 123456; ....; 123; ..
  • def; dsa; 12435; ...... 124; ..

回答

0
var sorted = data.Select(line => new 
{ 
    SortKey = Int32.Parse(line.Split(';')[9]), 
    SortKeyThenBy = Int32.Parse(line.Split(';')[2]), 
    Line = line 
} 
).OrderBy(x => x.SortKey).ThenBy(x => x.SortKeyThenBy) 
+0

它的作品謝謝你。其實這很容易。 – eneseto 2014-10-10 09:37:58

0

您需要的第一排序依據後使用thenBy

  var sorted = data.Select(line => new 
      { 
       SortKey = Int32.Parse(line.Split(';')[9]), 
       Line = line 

      } 
      ).OrderBy(x => x.SortKey).ThenBy(x => x.Line); 
0

試試這個:

var sorted = data.Select(line => new 
     { 
      SortKey = Int32.Parse(line.Split(';')[9]), 
      SortKey2 = line.Split(';')[2], 
      Line = line 

     } 
     ).OrderBy(x => x.SortKey).ThenBy(x=>x.SortKey2).Select(x => x.Line); 

基本上添加第二排序標準,然後排序按照指定的順序。

1

你必須使用OrderBy(...).ThenBy(...)

var lines = File.ReadLines(filePath, Encoding.Default); 
var data = lines 
      .Skip(1) 
      .Select(l => new{Fields = l.Split(';'), Line = l}) 
      .Where(x => x.Fields.Length == 14 && x.Fields[9].All(Char.IsDigit)) 
      .OrderBy(x => int.Parse(x.Fields[9])) 
      .ThenBy(x => x.Fields[2]) 
      .Select(x => x.Line); 
File.WriteAllLines("D:\\sortedCsv.csv", lines.Take(1).Concat(data), Encoding.Default); 

注意File.ReadLines比在這種情況下File.ReadAllLines更有效。

相關問題