C#Groupby然后在拆分CSV之后求和(无标题)

时间:2016-09-01 05:06:51

标签: c# .net linq group-by

阅读过各种帖子后,我想我已经接近得到了我想要的结果,但是"总和"部分给出了错误的答案。我怀疑它是由于我称之为" sum"因为我的csv文件没有列标题。

csv文件包含以下内容:

  

222,1

     

223,2

     

222,1

     

224,2

     

222,-1

我想要的是:

  • 读取CSV文件并拆分数据
  • 分组第一栏
  • 按组分列第二列

这是我到目前为止所做的:

var newquery = from line in File.ReadAllLines(path_source) //read all lines in csv file
                       let values = line.Split(',') //split the values by separator
                       let price_value = values[0]                                                      
                       group line by price_value into g                           
                       orderby g.Key
                       //select g;
                       select new 
                       {
                           price_column = g.Key,
                           qty_column = g.Sum(x => x[1]) 
                       };

var writesum = newquery.Select(record => record.price_column + "," + record.qty_column);

File.WriteAllLines(path_target, writesum);

path_target文件显示:

  

222,45

     

223,80

     

224,65

这告诉我splitgroupbyorderby语法是正确的,但sum完全错误。

我怀疑sum的结果错误的原因之一是由于此处qty_column = g.Sum(x => x[1])的语法。

由于我的数据不包含标题,因此我无法像示例中那样调用x.something

另一方面,我在这一点上可能完全错了!

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

首先,在分割后对值进行分组,而不是原始行:

group line by price_value into g

而不是

string

接下来,在你总结之前,将ints总和为qty_column = g.Sum(x => int.Parse(x[1])) 进行解析:

qty_column = g.Sum(x => x[1])

而不是

x[1]

因为stringvar newquery = from line in File.ReadAllLines(path_source) //read all lines in csv file. let values = line.Split(',') //split the values by separator let price_value = values[0] group values by price_value into g orderby g.Key //select g; select new { price_column = g.Key, qty_column = g.Sum(x => int.Parse(x[1])) };

现在的结果是:

var v = new List<string> File.ReadAllLines(path_source) //read all lines in csv file.
    .Select(x => x.Split(','))
    .Select(x => new { Key = x.First(), Value = x.Last() })
    .GroupBy(x => x.Key)
    .Select(x => new
    {
        price_column = x.Key,
        qty_column = x.Sum(y => int.Parse(y.Value))
    });

这给了你:

  

222,1

     

223,2

     

224,2

无论如何,流利的语法会更具可读性:

+=