使用c#将CSV中相同单元格的7行合并

时间:2017-06-21 11:29:00

标签: c# xml csv

我已根据特定的decendant将xml文件转换为csv文件。 这是我获得 csv file example

的结果

在文件中我有3个产品,每个产品最多需要7行,我希望按照产品合并所有细节,因为许多单元格值相同。

我希望我的结果如下expected result of csv file

我怎样才能在c#中做到这一点?

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

1 个答案:

答案 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);
    }
}

披露:我是这个图书馆的作者