【问题标题】:Read previous line using File.ReadLines [duplicate]使用 File.ReadLines 读取上一行 [重复]
【发布时间】:2014-12-02 02:27:00
【问题描述】:

我想从最后一行读取一个文本文件,因为它可能很大并且只想检查今天的日志内容。

我正在使用File.ReadLines() 并成功读取最后一行。 我怎样才能阅读上一行? 或者有什么办法可以得到当前的行号,这样我就可以减去这个数字?

foreach (string f in Directory.GetFiles(sDir, "*.log", SearchOption.AllDirectories))
{
    string last = File.ReadLines(f, Encoding.Default).Last(); //read Last Line here

    if (last.IndexOf("error", StringComparison.OrdinalIgnoreCase) > 0)
    {
        WriteError(last);
    }
}

【问题讨论】:

  • 只有一行?您如何确定要回溯多远?如果你会以某种方式即时决定,你可能最好使用流重新开始,在那里你可以向后移动读取指针。

标签: c# file.readalllines


【解决方案1】:
foreach (string f in Directory.GetFiles(sDir, "*.log", SearchOption.AllDirectories))
{
    string last="", prev="";
    foreach (string cur in  File.ReadLines(f, Encoding.Default) )
    {
        prev = last;
        last = cur;
    }

    //not sure what you want to do with "prev" here.
    if (last.IndexOf("error", StringComparison.OrdinalIgnoreCase) > 0)
    {
        WriteError(last);
    }
}

【讨论】:

  • 我强烈怀疑 OP 正在寻找的不仅仅是 last+next to last,在这种情况下它不会扩展......
  • 为所需的行数添加一个数组并移动数组并不难,但是在 OP 添加更多信息之前,我们无法知道要执行多少操作。在问题更新之前,我看不到如何提供更多内容。
【解决方案2】:

我不清楚您是否要求避免阅读整个文件(在这种情况下,建议的重复答案是解决此问题的最佳方法),或者您只是希望能够找出下一个-文件中的最后一行。

如果是后者,那么这将起作用:

string[] Tail(string file, int maxLinesToReturn, Encoding encoding)
{
    Queue<string> mostRecentLines = new Queue<string>();

    foreach (string line in File.ReadLines(file, encoding))
    {
        if (mostRecentLines.Count >= maxLinesToReturn)
        {
            mostRecentLines.Dequeue();
        }
        mostRecentLines.Enqueue(line);
    }

    return mostRecentLines.ToArray();
}

这样使用:

foreach (string f in Directory.GetFiles(sDir, "*.log", SearchOption.AllDirectories))
{
    foreach (string line in Tail(f, 2, Encoding.Default)
        .Where(line => line.IndexOf("error", StringComparison.OrdinalIgnoreCase) > 0)))
    {
        WriteError(line);
    }
}

【讨论】:

  • 我们的两个答案仍然读取整个文件。这就是他们知道换行符在哪里的方式。如果他想避免读取整个文件,他需要在低得多的级别上工作,使用流从最后向后工作。
  • 是的,没错。这就是为什么我还投票决定将问题作为问题第一条评论中引用的答案的副本来结束(这是一个完全做到这一点的实现,从最后开始向后工作)。但是,推断他/她不介意阅读整个文件是对这个问题的完全合理的解读:即使是一个“巨大”的文件,它可能会产生比人类想要阅读的更多的输出,也可以相对很短的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2017-03-31
相关资源
最近更新 更多