阅读过各种帖子后,我想我已经接近得到了我想要的结果,但是"总和"部分给出了错误的答案。我怀疑它是由于我称之为" sum"因为我的csv文件没有列标题。
csv文件包含以下内容:
222,1
223,2
222,1
224,2
222,-1
我想要的是:
这是我到目前为止所做的:
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
这告诉我split
,groupby
,orderby
语法是正确的,但sum
完全错误。
我怀疑sum
的结果错误的原因之一是由于此处qty_column = g.Sum(x => x[1])
的语法。
由于我的数据不包含标题,因此我无法像示例中那样调用x.something
。
另一方面,我在这一点上可能完全错了!
非常感谢任何帮助。
答案 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]
因为string
是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 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
无论如何,流利的语法会更具可读性:
+=