我有这样的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循环内).
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)
尝试使用这个旧的但仍然很好的库: 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)
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)