使用LINQ读取Csv

我有这样的csv文件

A, 22, 23, 12 B, 32, 4, 33 C, 34, 3 ,33 

我想打印每行的总和和平均值,并跳过第一列。 如何在LINQ中使用Lambda

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

如果您正在阅读大文件并且内存使用是一个问题,那么使用.NET 4可以更好地使用以下内容:

 var stuff = from l in File.ReadLines(filename) let x = l.Split(new [] {',', ' '}, StringSplitOptions.RemoveEmptyEntries) .Skip(1) .Select(s => int.Parse(s)) select new { Sum = x.Sum(), Average = x.Average() }; 

在这两种情况下, stuff变量都包含一个枚举,直到你开始读取它才会实际执行(例如在foreach循环中)。

  string csvFile = @"myfile.csv"; string[] lines = File.ReadAllLines(csvFile); var values = lines.Select(l => new { FirstColumn = l.Split(',').First(), Values = l.Split(',').Skip(1).Select(v => int.Parse(v)) }); foreach (var value in values) { Console.WriteLine(string.Format("Column '{0}', Sum: {1}, Average {2}", value.FirstColumn, value.Values.Sum(), value.Values.Average())); } 

尝试使用这个旧的但仍然很好的库: FileHelpers Library

它非常易于使用:

 char delimiter = ','; var dt = FileHelpers.CsvEngine.CsvToDataTable(fileName,delimiter); 

然后就是:

 var rowStats = dt.AsEnumerable() .Select(x => x.ItemArray.Select(y => Convert.ToInt32(y))) .Select(x => new { avg = x.Average(), sum = x.Sum() }); foreach (var rowStat in rowStats) { Console.WriteLine("Sum: {0}, Avg: {1}", rowStat.sum, rowStat.avg); } 
 string[] csvlines = File.ReadAllLines(@txtCSVFile.Text); var query = from csvline in csvlines let data = csvline.Split(',') select new { ID = data[0], FirstNumber = data[1], SecondNumber = data[2], ThirdNumber = data[3] }; 

我刚刚发现了LinqToCsv库,它执行所有解析的东西,然后你可以查询像集合这样的对象,它支持延迟读取:

http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library

嗨,你正在寻找这样的东西

  var rows = new List {"A, 22, 23, 12", "B, 32, 4, 33", "C, 34, 3 ,33"}; foreach (var row in rows) { var sum = row.Split(',').Skip(1).Sum(x => Convert.ToInt32(x)); var avg = row.Split(',').Skip(1).Average(x => Convert.ToInt32(x)); } 

这样的事情可能是:

 var csv = @"A, 22, 23, 12 B, 32, 4, 33 C, 34, 3 ,33"; var lines = csv.Split('\n').Select(x => x.Split(',').Skip(1).Select(n => int.Parse(n))).Select(x => new {Sum = x.Sum(), Average = x.Average()}); foreach (var line in lines) { Console.WriteLine("Sum: " + line.Sum); Console.WriteLine("Average: " + line.Average); } 

一般来说,我不建议做这样的事情。 您应该使用完整的CSV读取器来解析CSV文件,并且应该包括error handling。

 using System.IO // turn file into IEnumerable (streaming works better for larger files) IEnumerable> GetTypedEnumerator(string FilePath){ var File = File.OpenText(FilePath); while(!File.EndOfStream) yield return new Tuple( Int.Parse(File[1]), Int.Parse(File[2], Int.Parse(File[3]) ); File.Close(); } // this lines would return the sum and avg for each line var tot = GetTypeEnumerator(@"C:\file.csv").Select(l=>l.Item1 + l.Item2 + l.Item3); var avg = GetTypeEnumerator(@"C:\file.csv").Select(l=> (l.Item1 + l.Item2 + l.Item3) / 3); 

流式aporoach将允许您处理laregr文件,因为您不需要首先将它们插入到内存中。 这里没有VS,没有检查语法,可能无法按原样编译。

关心GJ

该死的,已经有很多答案,需要打字更快!