使用LINQ读取Csv

Joe*_*oel 25 c# linq

我有这样的csv文件

A, 22, 23, 12
B, 32, 4, 33
C, 34, 3 ,33
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*thy 40

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()
            };
Run Code Online (Sandbox Code Playgroud)

如果您正在阅读大文件并且内存使用是一个问题,那么使用.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()
            };
Run Code Online (Sandbox Code Playgroud)

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

  • 不完全一样,但如果您使用的是.NET 4,只需将`ReadAllLines`更改为`ReadLines`即可. (2认同)

Dun*_*tts 9

        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()));
        }
Run Code Online (Sandbox Code Playgroud)


dig*_*All 6

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

它非常容易使用:

char delimiter = ',';
var dt = FileHelpers.CsvEngine.CsvToDataTable(fileName,delimiter);
Run Code Online (Sandbox Code Playgroud)

然后就是:

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);
}
Run Code Online (Sandbox Code Playgroud)


MUG*_*G4N 5

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]
  };
Run Code Online (Sandbox Code Playgroud)

  • 您需要在投影上添加聚合 (2认同)
  • 用逗号分割是一个坏主意,数据可以包含逗号。 (2认同)