我已经根据一个特定的子集将一个xml文件转换为csv文件。这是我获得 csv file example的结果
在文件中我有3个产品,每个产品占7行,我希望合并每个产品的所有细节,因为许多单元格值是相同的。
我希望我的结果是跟随expected result of csv file
我如何在c#中做到这一点?
注意,我的列数保持不变
发布于 2017-07-20 07:26:22
您可以使用linq根据请求合并相关的行。
假设,您定义了一个对象来表示每个CSV行,如下所示(为了澄清,只提到了几列)
public class Item
{
public string szItemId { get; set; }
public string szName { get; set; }
public string lRetailStoreID { get; set; }
public string szDesc { get; set; }
}现在很难使用Linq projection query合并它们,如下所示
var recs = p.Where(r => !String.IsNullOrEmpty(r.szItemId)).GroupBy(r => r.szItemId)
.Select(g => new {
szItemId = g.Key,
szName = g.Where(i1 => !String.IsNullOrEmpty(i1.szName)).Select(i1 => i1.szName).FirstOrDefault(),
lRetailStoreID = g.Where(i1 => !String.IsNullOrEmpty(i1.lRetailStoreID)).Select(i1 => i1.lRetailStoreID).FirstOrDefault(),
szDesc = g.Where(i1 => !String.IsNullOrEmpty(i1.szDesc)).Select(i1 => i1.szDesc).FirstOrDefault()
});上面的查询给出了来自输入csv文件的合并行。现在您可以迭代并将它们写入CSV。
希望这能有所帮助。
使用Cinchoo ETL -一个开源框架,您只需几行代码即可快速读取和编写CSV文件,如下所示
using (var p = new ChoCSVReader("mergeinput.csv").WithFirstLineHeader())
{
var recs = p.Where(r => !String.IsNullOrEmpty(r.szItemId)).GroupBy(r => r.szItemId)
.Select(g => new {
szItemId = g.Key,
szName = g.Where(i1 => !String.IsNullOrEmpty(i1.szName)).Select(i1 => i1.szName).FirstOrDefault(),
lRetailStoreID = g.Where(i1 => !String.IsNullOrEmpty(i1.lRetailStoreID)).Select(i1 => i1.lRetailStoreID).FirstOrDefault(),
szDesc = g.Where(i1 => !String.IsNullOrEmpty(i1.szDesc)).Select(i1 => i1.szDesc).FirstOrDefault()
});
using (var o = new ChoCSVWriter("mergeoutput.csv").WithFirstLineHeader())
{
o.Write(recs);
}
}披露:我是这个库的作者
https://stackoverflow.com/questions/44674843
复制相似问题