StreamReader.ReadLine()从流的末尾开始

时间:2009-07-09 16:50:10

标签: c# parsing

我在C#/ .NET中工作,我正在解析一个文件以检查一行是否与特定的正则表达式匹配。实际上,我想找到匹配的 last 行。

要获取我的文件的行,我目前正在使用System.IO.StreamReader.ReadLine()方法,但由于我的文件非常庞大,我想优化一点代码并从最后开始文件。

有没有人知道C#/ .NET中是否有一个类似于ReadLine()的函数从流的末尾开始?如果不是,那么在您看来,最简单,最优化的方式来完成上述工作会是什么?

4 个答案:

答案 0 :(得分:6)

有趣的是你应该提到它 - 是的,我有。我刚才写了ReverseLineReader,并把它放在MiscUtil

在Stack Overflow上回答this question - 答案包含代码,尽管它也使用了MiscUtil的其他位。

它只会处理一些编码,但希望你需要的所有编码。请注意,如果您必须阅读整个文件,这将比从文件的开头读取效率低 - 所有类型的事物都可能假定通过文件进行前向运动,因此它们已针对此进行了优化。但如果你实际上只是阅读文件末尾附近的行,这可能是一个巨大的胜利:)

(不确定这是否应该是一次紧密投票......)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

“最简单”-vs-“最优化”......我认为你不会同时获得

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

您还可以使用FileStream设置文件末尾附近的位置。完成上述步骤,如果未找到匹配项,请在文件中先设置FileStream位置,直到找到匹配项。

答案 3 :(得分:0)

这应该做你想要的,它可能是你需要的记忆重,但我不知道你在那个领域的需求:

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

它仍然需要在开始时读取每一行,但它可能比在你执行每一行检查时更快。