LINQ Groupby C# from CSV

本文关键字:CSV from Groupby LINQ | 更新日期: 2023-09-27 18:11:44

我成功地从while循环创建了一个CSV文件。我最终需要我的代码来生成另一个具有GroupBy信息的CSV文件。

它看起来像这样:

while (code)
{
    output3 = split[5].Replace(',', ' ') + ',' +
        split[0].Substring(0, 2) + "-" +
        split[0].Substring(2, 4) + ',' +
        split[4] + ",," + sentprice + ',' +
        split[3] + ',' +
        split[2] + ',' + calccharge + ',' +
        split[1] + ",,," + "NA" + ',' + "A" + ',' +
        split[0].Substring(6, 5) + Environment.NewLine + output3;
}

现在我正试图分割output3,以便我可以按其中一列(即split[1])分组。

我试过:

var table = File.ReadAllLines(FilePath)
    .Select(record => record.Split(','))
    .Select(cell => new { AFPCode = cell[1] }) 
    .GroupBy(x => x.AFPCode);

,但是这个结果给了我一个在数组边界之外的索引。正如你所看到的,索引在数组的边界内。

我也试过了:

IEnumerable<string> table = 
    from row in File.ReadAllLines(FilePath)
    let elements = row.Split(',')
    let cell = new {AFPCode = elements[1]}
    group p by p.AFPcode into g

这也不工作。

LINQ Groupby C# from CSV

部分行缺少第二列。您是否尝试像下面这样过滤掉这些行?

var table = File.ReadAllLines(FilePath)
    .Select(record => record.Split(','))
    .Where(cell => cell.Length >= 2) // Add filter clause here
    .Select(cell => new { AFPCode = cell[1] }) 
    .GroupBy(x => x.AFPCode);

在文件末尾有一个空行。当您将空行拆分为字段时,它没有第二项。要么删除末尾的空行,要么过滤掉用于读取文件的代码中的空行。

一些旁注,您不应该通过使用+操作符在循环中将字符串彼此连接来构建大型文件。这是一个特别低效的操作。您可以使用string.Join有效地将一堆字符串连接在一起(行上的所有字段或文件中的所有行)。

另一种选择是在计算时将每一行写入文件(这实际上更好,因为这样内存中永远不会有超过一行)。这可以很容易地完成使用File.WriteAllLines,如果你有一个序列的所有行。