2014-11-06 53 views
1

我在CSV文件中有以下幾行(更多,但此示例很好)。使用Linq讀取CSV

Date,Open,High,Low,Close,Volume,Adj Close 
2012-11-01,77.60,78.12,77.37,78.05,186200,78.05 
2012-10-31,76.96,77.75,76.96,77.47,290700,77.47 
2012-10-26,77.30,77.62,76.86,77.36,195100,77.36 

我需要對數據執行幾個不同的功能,每個功能只需要從一行中的某些字段。即函數1將需要來自每行的第2和第3組數據,函數2將需要第4組數據。我將如何做到這一點與LINQ(跳過第一行)?

+3

你有什麼研究,當涉及到解析一個CSV文件?你試過什麼了?你試圖解決的問題有什麼問題? – Servy 2014-11-06 20:46:41

+0

我在研究過程中在其他文章中發現了以下內容。 'let x = l.Split(new [] {',',''},StringSplitOptions.RemoveEmptyEntries) .Skip(1) 。選擇(s => int.Parse(s))'這看起來像一個漂亮的爲我的問題提供了很好的解決方案,但有幾件事情會讓我的語法更加混亂。跳過命令,是否跳過一行,或行的第一部分?而拆分,是否只是將逗號之間的數據集分成單獨的實體?這就是我困惑的地方我猜 – user3066571 2014-11-06 20:49:28

+0

閱讀每種方法的文檔。這應該永遠是您理解這些方法的第一步。您也可以通過調用每個方法的硬編碼數據並觀察結果來進行實驗,以更好地理解它們的工作方式。 – Servy 2014-11-06 20:51:59

回答

3

你可以試試這個: -

  var lines = File.ReadAllLines(@"Linq.csv").Select(x => x.Split(',')); 
      //Considering each line contains same no. of elements 
      int lineLength = lines.First().Count(); 
      var CSV = lines.Skip(1) 
         .SelectMany(x => x) 
         .Select((v, i) => new { Value = v, Index = i % lineLength }) 
         .Where(x => x.Index == 2 || x.Index == 3) 
         .Select(x => x.Value); 
      foreach (var data in CSV) 
      { 
       Console.WriteLine(data); 
      } 

步驟: -

步驟1 - 閱讀從CSV文件中的所有行,並用逗號(,),這將導致陣列OS字符串分割他們與每個價值。

步驟2 - 跳過第一個數組(其中包含標題),然後使用SelectMany將列表壓扁成一個,然後您需要爲每個集合(在拼合列表中)設置相似的索引,即I我正在使用Select opertaor,剩下的最後一件事就是過濾&選擇該項目。

0

您可以嘗試波紋管代碼功能1

var stuff = from l in File.ReadAllLines(filename) 
     let x = l.Skip(1).Split(new [] {',', ' '}, StringSplitOptions.RemoveEmptyEntries) 
       .Select(s => s) 
       .select new 
        { 
         second= s[1], 
         third= s[2] 
        };