【问题标题】:Merge 7 rows with identical cells in CSV with c#使用 c# 合并 CSV 中具有相同单元格的 7 行
【发布时间】:2017-06-21 11:28:59
【问题描述】:

我已根据特定的后代将 xml 文件转换为 csv 文件。 这是我得到的结果 csv file example

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

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

我如何在 C# 中做到这一点?

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

【问题讨论】:

  • 没有单元格或与 CSV 文件合并之类的东西。这些只是文本文件。它们的显示方式完全取决于显示它们的应用程序。 Nothing 表示文件的每一行应该有相同数量的字段。
  • 如果您想要列和合并单元格,请创建一个包含 EPPlus 之类的库的 Excel 文件。就像调用sheet.LoadFromCollection(orders) 或sheet.LoadFromDataTable(ordersTable) 一样简单
  • 更多,到目前为止你尝试了什么?你似乎没有告诉我们你失败的地方
  • @BugFinder OP 所要求的对于 CSV 来说是不可能的,即普通旧文本文件 - 如果一行的字段少于前一个,则合并哪些字段?是否已合并任何个字段,还是缺少最后一个字段?
  • 我会建议使用像 Epplus 这样的库来操作 csv。它使用起来非常简单。

标签: c# xml csv


【解决方案1】:

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

披露:我是这个库的作者

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多