带有行号(索引)的 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 语句中正确获取索引?

感谢

带有行号(索引)的 Linq CSV 导入

您只能使用方法语法"注入"索引:

_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.SelectWhere具有适当的重载。

由于它是一个数组,这实际上可以工作。但是要改变底层实现(即我不推荐它(。

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 查询格式中是不可能的。