【问题标题】:Linq CSV Import with line-numers (index)带行号(索引)的 Linq CSV 导入
【发布时间】:2013-07-25 12:30:39
【问题描述】:

我必须导入一个 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-Statement 中获得正确的索引?

感谢

【问题讨论】:

  • 必须是LINQ查询语法吗?或者也可以是方法语法?
  • 任何一种方式都可以。蒂姆已经用方法语法回答了它:)

标签: c# linq csv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    因为它是一个数组,所以这实际上可以工作。但是要经常切换底层实现(即我不会推荐它)。

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

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多