带有行号(索引)的 Linq CSV 导入
本文关键字:Linq CSV 导入 索引 | 更新日期: 2023-09-27 18:24:58
我必须导入一个CSV文件。由于行顺序对数据很重要,因此我需要将其作为导入(索引(的一部分。我现在所做的(解决方法(如下:
string[] allLines = File.ReadAllLines(soureFilePath, Encoding.Default);
//Add Line-Index
for (int i = 0; i < allLines.Length; i++)
{
allLines[i] = i + ";" + allLines[i];
}
_sourceList = (from line in allLines.Skip(1)
let data = line.Split(new[] {';'}, StringSplitOptions.None)
select
new MappingSource
{
Index = Convert.ToInt32(data[0]),
TargetEntity = data[1].Trim(),
TargetFolder = data[2].Trim(),
TargetLevel = data[3].Replace(',', '.').Trim(),
FolderDefinition = data[4].Trim(),
Type = data[5].Trim(),
SourceFolder = data[6].Trim(),
SourceLevel = data[7].Replace(',', '.').Trim(),
BucketStructure = data[8].Trim()
}).ToList();
我觉得这不是很优雅。有没有办法在 Linq 语句中正确获取索引?
感谢
您只能使用方法语法"注入"索引:
_sourceList = allLines.Skip(1)
.Select((line, index) => new{ data = line.Split(new[] {';'}, StringSplitOptions.None), line, index})
.Select(x => new MappingSource{ Index = x.index, TargetEntity = x.data[0].Trim(), ...)
.ToList()
Enumerable.Select
和Where
具有适当的重载。
由于它是一个数组,这实际上可以工作。但是要改变底层实现(即我不推荐它(。
var i = 0;
_sourceList = (from line in allLines.Skip(1)
let data = line.Split(new[] {';'}, StringSplitOptions.None)
select
new MappingSource
{
Index = i++,
TargetEntity = data[0].Trim(),
TargetFolder = data[1].Trim(),
TargetLevel = data[2].Replace(',', '.').Trim(),
FolderDefinition = data[3].Trim(),
Type = data[4].Trim(),
SourceFolder = data[5].Trim(),
SourceLevel = data[6].Replace(',', '.').Trim(),
BucketStructure = data[7].Trim()
}).ToList();
另一种方法是使用第二个 IEnumerable.Select((,它提供元素和索引,但该元素在 LINQ 查询格式中是不可能的。