C# 将CSV中具有相同单元格的7行与c合并#
我已经将xml文件转换为基于特定Decentant的csv文件。 这是我得到的结果 在该文件中,我有3个产品,每个产品多达7行,我希望根据产品合并所有细节,因为许多单元格值相同 我希望我的结果如下 我怎么能在c#中做到这一点C# 将CSV中具有相同单元格的7行与c合并#,c#,xml,csv,C#,Xml,Csv,我已经将xml文件转换为基于特定Decentant的csv文件。 这是我得到的结果 在该文件中,我有3个产品,每个产品多达7行,我希望根据产品合并所有细节,因为许多单元格值相同 我希望我的结果如下 我怎么能在c#中做到这一点 请注意,我的列数保持不变您可以根据请求使用linq组合相关行 比方说,您定义了对象来表示每个CSV行,如下所示(对于澄清,仅提及了几列) 现在,使用Linq投影查询合并它们的困难部分如下 var recs = p.Where(r => !String.IsNullO
请注意,我的列数保持不变您可以根据请求使用linq组合相关行 比方说,您定义了对象来表示每个CSV行,如下所示(对于澄清,仅提及了几列) 现在,使用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
希望这有帮助
有了开源框架,您只需几行代码就可以快速读写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);
}
}
披露:我是这个库的作者没有单元格或与CSV文件合并这样的事情。这些只是文本文件。它们的显示方式完全取决于显示它们的应用程序。没有什么规定文件的每一行中应有相同数量的字段。如果需要列和合并的单元格,请创建一个Excel文件,并使用类似的库。它只需调用
sheet.LoadFromCollection(orders)
或sheet.LoadFromDataTable(ordersTable)
更多信息,到目前为止您尝试了什么?你似乎没有告诉我们你在哪里failed@BugFinderOP所要求的内容在CSV(即纯文本文件)中根本不可能实现——如果一行的字段数少于前一行,则合并哪些字段?它们是否合并了,或者最后一个字段丢失了?我建议使用像Epplus这样的库来处理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);
}
}