【问题标题】:Grouping CSV lines into one将 CSV 行分组为一个
【发布时间】:2012-01-24 09:15:37
【问题描述】:

我有一个包含行的 CSV 文件,其中某些列的数据只出现在其中一行中,而其他列重复它们的值:

Heading1, Heading2, Heading3, Heading4
1       , 2       ,         , 4
1       ,         , 3       , 4

我怎么能得到:

Heading1, Heading2, Heading3, Heading4
1       , 2       , 3       , 4

我想对 Heading1 和 Heading4 进行分组,因为它们对于重复的行是唯一的,并为所有其他行获取第一个非空白值,最后得到一个 string[]

我已经在new { Header1, Header4 } 上进行分组以获得一组行,但是我很难将其转换为可以为每列选择第一个非空值,然后将其转换为的东西回到单行 (string[])。

理想情况下,我想要一个可以处理任意数量列的函数,因为在实际文件中存在大量列。

【问题讨论】:

    标签: c# linq csv


    【解决方案1】:

    这可以通过 LINQ 使用 Aggregate 来完成。创建一个函数来比较 running totals 和当前行,如果总计不为空并且当前值,则将该列的 total 设置为该列的当前值不为空。

    [TestMethod]
    public void MergeArrays() {
    
        string[] Input = new[] { 
            "H1, H2, H3, H4",
            "1,2,,4",
            "1,,3,4"
        };
    
    
        var header = Input.ElementAt(0) ;
        var aggregation = string.Join(",", Input.Skip(1).Select(ln => ln.Split(',')).Aggregate(new[] { "", "", "", "" }, Agg));
    
        var result = new string[] { header, aggregation };
    
    
        Assert.AreEqual("H1, H2, H3, H4", header);
        Assert.AreEqual("1,2,3,4", aggregation);
    
    
    }
    
    
    private static string[] Agg(string[] aggregation, string[] input) {
    
        for (var idx = 0; idx < aggregation.GetLength(0); idx++) {
            if (aggregation[idx] == string.Empty &&input[idx] !=  string.Empty){
                aggregation[idx] = input[idx];
            }
        }
    
        return aggregation;
    
    }
    

    hth,
    艾伦。

    【讨论】:

      【解决方案2】:
      • 创建一个长度为 4 的数组,其值初始化为空字符串(或零,视情况而定)。
      • 对于每个非标题行,循环遍历字段,只要字段值不为空,就将值存储在相应的数组位置。
      • 将数组中的值写入新的 CSV 文件。

      【讨论】:

      • 嗯,这是有道理的——我想我陷入了 LINQ 的思维框架。也就是说,读取 CSV 行并生成 CSV 行的函数(在内部使用您描述的方法以及yield)可能有用。
      • @GeorgeDuckett 听起来你现在走在正确的轨道上。祝你的项目好运:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2016-04-15
      相关资源
      最近更新 更多