代码之家  ›  专栏  ›  技术社区  ›  pierroz

streamreader.readline()从流的末尾开始

  •  1
  • pierroz  · 技术社区  · 16 年前

    我在C/.NET中工作,我正在分析一个文件,以检查其中一行是否与特定的regex匹配。实际上,我想找到 最后的 匹配的行。

    为了获得文件的行数,我目前正在使用system.io.streamreader.readline()方法,但是由于我的文件非常庞大,我想对代码进行一点优化,从文件的末尾开始。

    有人知道C/.NET中是否有一个类似于readline()的函数,从流的末尾开始?如果不是的话,在你看来,做上述工作最简单、最优化的方法是什么?

    4 回复  |  直到 9 年前
        1
  •  6
  •   Community CDub    8 年前

    有趣的是,你应该提一下-是的,我提过。我写了一篇 ReverseLineReader 不久前,把它放进去 MiscUtil .

    它是对 this question 在堆栈溢出时-答案包含代码,尽管它也使用miscutil的其他位。

    它只能处理一些编码,但希望所有你需要的编码。请注意,如果必须读取整个文件,这将比从文件开始处读取效率低——所有类型的事情都可能假定文件向前移动,因此对此进行了优化。但如果你实际上只是在读文件结尾附近的行,这可能是一个巨大的胜利:)

    (不确定这是否应该只是一个接近的投票…)

        2
  •  0
  •   Andrew Hare    16 年前

    因为您使用的是正则表达式,所以我认为您最好的选择是将整行内容读入内存,然后尝试匹配它。

    如果您向我们提供正则表达式和文件内容示例,我们可能会找到更好的方法来解决您的问题。

        3
  •  0
  •   Brad Bruce    16 年前

    “最简单”-vs-“最优化”…我不认为你会两个都得到

    您可以打开文件并读取每一行。每次找到符合条件的实例时,都将其存储在一个变量中(替换任何早期的实例)。完成后,您将得到最后一行匹配的内容。

    您还可以使用文件流设置文件结尾附近的位置。执行上述步骤,如果找不到匹配项,请在文件的前面设置文件流位置,直到找到匹配项为止。

        4
  •  0
  •   Ben Lesh    16 年前

    这应该是你想要的,它可能是你需要的记忆沉重,但我不知道你在这方面的需要是什么:

            string[] lines = File.ReadAllLines("C:\\somefilehere.txt");
            IEnumerable<string> revLines = lines.Reverse();
            foreach(string line in revLines) {
                /*do whatever*/
            }
    

    它仍然需要从一开始就阅读每一行,但是它可能比在检查每一行时更快。