【问题标题】:How can read correctly file line by line using Stream reader c#如何使用 Stream reader c# 逐行正确读取文件
【发布时间】:2016-01-24 15:10:07
【问题描述】:

如何逐行读取文件中的文本?

我使用的这段代码在第一次循环中读取第一行和第二行。 以下内容不起作用,因为它在方法 sr.ReadLine() 中返回两个不同的字符串。 ReadLine() 方法是否从文件中获取下一行而不是当前行?

List<string> allInformation = new List<string>();
DateTime minimumDateTime = times[this.Step].AddMinutes(-different);
DateTime maximumDateTime = times[this.Step].AddMinutes(different);

using (FileStream fs = System.IO.File.Open(this.File, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
    DateTime thisTime;
    string[] info = new string[6];

    while (sr.Peek() >= 0)
    {
        info = sr.ReadLine().Split(new string[] { ", ", ",", "\"" }, StringSplitOptions.RemoveEmptyEntries);
        thisTime = DateTime.ParseExact(info[FileConstants.DATE], "yyyy-M-d H:m:s", null);

        if (thisTime > minimumDateTime && thisTime < maximumDateTime)
        {
            allInformation.Add(sr.ReadLine());
        }
    }
}

【问题讨论】:

  • 您在循环中调用了两次ReadLine。调用一次并将其分配给局部变量以供以后使用。
  • 就像朱哈尔说的。读取线的两倍。这是蒂姆答案的替代方案。 stackoverflow.com/a/9643111/169714
  • 我已修复并且工作正常。感谢大家的快速回答。我可以相信回复我的速度有多快。

标签: c# file streamreader


【解决方案1】:

您在循环中使用了两次ReadLine。将StreamReader.ReadLine 的返回值存储在字符串变量中。否则,您会将阅读器推进到下一行。

while (sr.Peek() >= 0)
{
    string line = sr.ReadLine();
    info = line.Split(new string[] { ", ", ",", "\"" }, StringSplitOptions.RemoveEmptyEntries);
    thisTime = DateTime.ParseExact(info[FileConstants.DATE], "yyyy-M-d H:m:s", null);

    if (thisTime > minimumDateTime && thisTime < maximumDateTime)
    {
        allInformation.Add(line);
    }
}

【讨论】:

  • 感谢您快速正确的回答。现在工作正常。
【解决方案2】:

我知道你已经有了答案,但我只是想指出,你可以像这样使用 Linq 更简洁地编写整个方法:

var minimumDateTime = times[this.Step].AddMinutes(-different);
var maximumDateTime = times[this.Step].AddMinutes(different);

var linesInDateRange = 
    from   line in System.IO.File.ReadLines(this.File)
    let    info = line.Split(new[] {", ", ",", "\""}, StringSplitOptions.RemoveEmptyEntries)
    let    thisTime = DateTime.ParseExact(info[FileConstants.DATE], "yyyy-M-d H:m:s", null)
    where  thisTime > minimumDateTime && thisTime < maximumDateTime
    select line;

var allInformation = linesInDateRange.ToList();

【讨论】:

  • 谁是最快的方法。对我来说,速度如此之快非常重要。我不擅长 linq,而且这段代码对我来说并不是真正可读的。但是如果更快,那么我使用了这段代码。当我测试时,看起来与 StreamReader 代码的速度相同。
  • @EvgeniVelikovevelikov 实际上在速度上没有区别。这两种方法的代码都是 IO 绑定的;也就是说,读取文件所花费的时间将远远超过处理时间,因此您无法真正让它更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 2014-06-21
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多