使用 LINQ 读取 CSV - 索引越界

问题描述 投票:0回答:1

我的 .csv 的格式为 -

Group No,Group Name,Type,Class,Category,Description,Product,Quantity,Stock,Id,Name
1,B,X,Y,Table,Wooden Table,Table,12,50,123,XYZ

我正在尝试使用以下 LINQ 读取此 .csv -

var data = lines
                .Select((line, index) => new { Line = line, Index = index + 1 }) // capture line number
                .Skip(1) // skip header
                .Select(x => x.Line.Split(',').Select(field => field.Trim()).ToArray()
                .Select(fields => new {
                    grpNo = fields[0],
                    product = fields[6],
                    Qty = fields[7],
                    stock = fields[8],
                    ID = fields[9],
                    Name = fields[10],
                    LineIndex = x.Index
                })).ToList();

问题是这个 LINQ 没有给我任何结果。我一步步调试了这个 LINQ,所以我发现在这部分之前我的 LINQ 工作正常并且我可以看到数据 -

var data = lines
                .Select((line, index) => new { Line = line, Index = index + 1 }) // capture line number
                .Skip(1) // skip header
                .Select(x => x.Line.Split(',').Select(field => field.Trim()).ToArray()

但是当我包含以下部分时 -

Select(fields => new {
                    grpNo = fields[0],
                    product = fields[6],
                    Qty = fields[7],
                    stock = fields[8],
                    ID = fields[9],
                    Name = fields[10],
                    LineIndex = x.Index
})).ToList();

它没有给我任何东西。经过调试,我发现在数据变量中,它说,

index out of bounds of the array

但我重新检查了它,我知道我为每个字段使用了正确的索引号。

我什至删除了所有内容并检查了

 grpNo = fields[0]
,它给了我同样的消息“索引超出范围”。

请提出建议。谢谢!

c# linq
1个回答
0
投票

最后一个子句中的括号包含错误的部分,因此会导致问题。从结构上来说,处理 CSV 文件的查询看起来不错。

...
.Select(x => x.Line.Split(',').Select(field => field.Trim()).ToArray() // <- select not closed
.Select(fields => new {
    grpNo = fields[0],
    product = fields[6],
    Qty = fields[7],
    stock = fields[8],
    ID = fields[9],
    Name = fields[10],
    LineIndex = x.Index
})).ToList();

您的最终

Select()
调用是针对单个行,而不是您解析的行集。我明白你为什么这样做,你需要访问索引。但您只需要首先执行中间步骤来构建行并包含索引,然后将字段放入其预期名称中。

.Select(x => new
{
    Row = x.Line.Split(',').Select(field => field.Trim()).ToArray(),
    x.Index,
})
.Select(x => new
{
    grpNo = x.Row[0],
    product = x.Row[6],
    Qty = x.Row[7],
    stock = x.Row[8],
    ID = x.Row[9],
    Name = x.Row[10],
    LineIndex = x.Index
})
.ToList();
© www.soinside.com 2019 - 2024. All rights reserved.