LINQ Groupby C#from CSV

时间:2014-07-07 18:53:20

标签: c# linq csv

我从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

这也行不通。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

第二列缺少某些行。您是否尝试过滤掉下面的行?

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);

答案 1 :(得分:0)

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

有些人注意到,你不应该使用+运算符来构造大文件,以便在循环中将字符串相互连接起来。这是一种效率特别低的操作。您可以使用string.Join有效地将一串字符串连接在一起(一行中的所有字段或文件中的所有行)。

另一种选择是在计算文件时将每一行写出来(实际上这更好,因为你的内存中永远不会有多行)。如果您拥有所有行的序列,则可以使用File.WriteAllLines轻松完成此操作。