我的 .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]
,它给了我同样的消息“索引超出范围”。
请提出建议。谢谢!
最后一个子句中的括号包含错误的部分,因此会导致问题。从结构上来说,处理 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();