Read Csv using LINQ
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()
};
If you're reading big files and memory use is a concern, then the following will work better using .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()
};
In both cases, the stuff
variable contains an enumerable which won't actually be executed until you start reading from it (e.g. inside a foreach
loop).
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()));
}
Try to use this old but still good library: FileHelpers Library
It's very easy to use:
char delimiter = ',';
var dt = FileHelpers.CsvEngine.CsvToDataTable(fileName,delimiter);
then just do:
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]
};