我在C#/ .NET中工作,我正在解析一个文件以检查一行是否与特定的正则表达式匹配。实际上,我想找到匹配的 last 行。
要获取我的文件的行,我目前正在使用System.IO.StreamReader.ReadLine()方法,但由于我的文件非常庞大,我想优化一点代码并从最后开始文件。
有没有人知道C#/ .NET中是否有一个类似于ReadLine()的函数从流的末尾开始?如果不是,那么在您看来,最简单,最优化的方式来完成上述工作会是什么?
答案 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*/
}
它仍然需要在开始时读取每一行,但它可能比在你执行每一行检查时更快。