使用LINQ忽略CSV中的空字段

时间:2014-08-18 19:52:31

标签: linq c#-4.0 csv

我有一个看起来像的csv:

Column1,Column2,Column3,Column4,Column5,Column6,Column7,Column7,Column8,Column9,
45.50334645,5640192,3915776,52633600,351924224,12354,90505216,78790656,247287808, 
39.23091283,5640192,3915776,52633600,349986816,4562,90505216,78790656,247287808, 
25.26042,5640192,3915776,52633600,349986816,   ,90505216,78790656,247287808,

我需要从每列中获取MIN,MAX和Average。我正在使用LINQ来执行此操作,因为CSV可能非常大。

这是我目前的代码。

var lines = System.IO.File.ReadAllLines(csvPath);
var columns = lines[0].Split(',');
for (int i = 1; i < columns.Count(); i++)
{
    var columnQuery = from line in lines
                        let elements = line.Split(',')
                        select Convert.ToDouble(elements[i]);

    var results = columnQuery.ToList();
    var min = results.Min();
    var max = results.Max();
    var avg = results.Average();
}

这将在csv中突出显示的值上出错,因为它被视为日期时间。

我得到的错误是&#34;输入字符串的格式不正确。&#34;

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用三元运算符:

var columnQuery = from line in lines
                  let elements = line.Split(',')
                  select string.IsNullOrWhiteSpace(elements[i]) ? 0. : Convert.ToDouble(elements[i]);

答案 1 :(得分:0)

您是否尝试过使用Double.TryParse代替Convert.ToDouble来避免异常 或者在where elements[i].Trim() != ""之前使用select明确过滤出空行?