我已根据特定的decendant将xml文件转换为csv文件。 这是我获得 csv file example
的结果在文件中我有3个产品,每个产品最多需要7行,我希望按照产品合并所有细节,因为许多单元格值相同。
我希望我的结果如下expected result of csv file
我怎样才能在c#中做到这一点?
请注意,我的列数保持不变
答案 0 :(得分:0)
您可以使用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投影查询合并它们,如下所示
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);
}
}
披露:我是这个图书馆的作者