2011-01-05 2 views
0

Если у меня есть следующий (примерный) текстовый файл;Linq to CSV select by column

year,2008,2009,2010 
income,1000,1500,2000 
dividends,100,200,300 
net profit,1100,1700,2300 
expenses,500,600,500 
profit,600,1100,1800 

Есть ли способ в Linq, чтобы я мог выбрать расходы только на 2010 год?

До сих пор у меня есть следующее, которое доставит мне все данные;

 var data = File.ReadAllLines(fileName) 
      .Select( 
       l => { 
        var split = l.CsvSplit(); 
        return split; 
       } 
      ); 

     foreach (var item in data) 
      Console.WriteLine("{0}: ${1}", item[0], item[1]); 
+0

Это 'data' a' string [] [] '? – Ani

+0

@Ani Select вернет 'IEnumerable ', и из его использования в foreach кажется, что T является 'string []' –

+0

@Kirk Broadhurst: Да, я должен был сказать 'IEnumerable '. – Ani

ответ

1

Если вы знаете, что всегда столбец третьего значения, то

// the expenses row 
var query = data.Single(d => d[0] == "expenses"); 

// the third column 
return query[3]; 

и если вы этого не сделаете, то

var columnNumber = Array.IndexOf(data.First(), "2010"); 
return query[columnNumber]; 
+0

не получает много любви с IndexOf. – griegs

+0

Я точно не использовал этот подход, но он указал мне в правильном направлении, спасибо @Kirk. – griegs

+0

@griegs Извините, используется для синтаксиса List/Linq. Я обновил его сейчас, чтобы использовать 'Array.IndexOf', который должен работать. –

1

См LINQtoCSV, его библиотека, которая делает все это для тебя. Я использовал его, и он работает как шарм.

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

+0

спасибо за это, я рассмотрю его сегодня. – griegs

+0

+1 Вау, это действительно крутая библиотека. благодаря – griegs