【问题标题】:Reading a specific line from a csv file and letting the line vary从 csv 文件中读取特定行并让行变化
【发布时间】:2015-05-19 14:52:30
【问题描述】:

我需要从 CSV 文件中取出 1 行,并且需要行号能够变化。我可以创建一个 int、double、string 等,我可以轻松地从外部程序更改值,但我不知道如何让文件阅读器脚本将其中一个作为行号的输入。

        string GetLine(string lineresults, int LineNumber)
    {
      using (var sr = new StreamReader(lineresults)) {
        for (int i = 1; i < line; i++)
          sr.ReadLine();
        return sr.ReadLine();
      }
    }

我在 GetLine 部分遇到分号和 closeparens 预期的错误

【问题讨论】:

  • var lines = File.ReadAllLines(...) 然后你可以访问lines[line_number - 1]
  • ...或者,如果您不想读取整个文件(例如,因为它很大),请使用 StreamReader 读取并丢弃前 line_number - 1 行,然后读取并保持线line_number
  • ... 或使用 Linq lines.Skip(line_number - 1).Take(1);
  • 请展示您到目前为止尝试过的内容。

标签: c# csv


【解决方案1】:

如果你想要随机访问,你可以读取所有行并将它们存储在一个数组中,所以File.ReadAllLines(记住你的变量LineNumber从0开始):

string[] allLines = File.ReadAllLines(pathToFile);
string line = allLines[LineNumber]; // error if less lines, check allLines.Length

另一种更有效的方法是使用 File.ReadLines 延迟加载行,然后使用 Enumerable.ElementAtElementAtOrDefault 访问行号:

var lines = File.ReadLines(pathToFile);
string line = lines.ElementAtOrDefault(LineNumber); // null if there are less lines

值得注意的是,它会读取文件直到到达行号或文件末尾。

MSDN:

ReadLines 和 ReadAllLines 方法的区别如下: ReadLines,可以开始枚举之前的字符串集合 整个集合被退回;当您使用 ReadAllLines 时,您必须 等待返回整个字符串数组,然后才能访问 数组。因此,当您处理非常大的文件时, ReadLines 可以更高效

【讨论】:

    【解决方案2】:

    正如@Alex K 评论的那样,只需将所有行读入一个数组,然后得到你想要的行。

    var lines = System.IO.File.ReadAllLines( filename);
    var line = lines[ lineIndex ];
    

    【讨论】:

      【解决方案3】:

      这个 NuGet 包对处理 CSV 非常有帮助。您可以从中获取单独的行,以及通过名称或索引获取单独的列。在此处查看信息:

      [Josh Close - CsvHelper][1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 2015-09-06
        相关资源
        最近更新 更多