Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将CSV中具有相同单元格的7行与c合并#_C#_Xml_Csv - Fatal编程技术网

C# 将CSV中具有相同单元格的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

我已经将xml文件转换为基于特定Decentant的csv文件。 这是我得到的结果

在该文件中,我有3个产品,每个产品多达7行,我希望根据产品合并所有细节,因为许多单元格值相同

我希望我的结果如下

我怎么能在c#中做到这一点


请注意,我的列数保持不变

您可以根据请求使用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);
    }
}