StreamReader.ReadLine()从流中的端部开始(StreamReader.ReadL

2019-10-16 21:13发布

我在C#/。NET的工作和我解析文件,以检查是否一行特定的正则表达式匹配。 其实,我要找到匹配的最后一行。

为了让我的文件的行,我目前使用的System.IO.StreamReader.ReadLine()方法,但我的文件是非常巨大的,我想优化位代码,并从文件末尾开始。

有谁知道是否有在C#/。NET类似功能的ReadLine()从流的末尾开始? 如果没有,会是什么,你的头脑,要做到上述工作的最简单和最优化的方式?

Answer 1:

真奇怪你会提到它 - 是的,我有。 我写了一个ReverseLineReader前一阵子,并把它放在MiscUtil 。

这是在回答这个问题上堆栈溢出-答案包含代码,尽管它使用MiscUtil等位了。

它只会用一些编码处理,但希望所有你需要的人。 请注意,这会比从文件开始阅读,如果你有阅读整个文件效率较低 - 各种各样的东西可以假设通过文件向前运动,所以他们对于优化。 但如果你实际上只是读附近的文件的末尾行,这可能是一个巨大的胜利:)

(不知道这是否应该刚刚接近的选票或不...)



Answer 2:

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

或许,如果你提供给我们的正则表达式的文件内容的示例中,我们可以找到一个更好的办法来解决问题。



Answer 3:

“最简单”的航班吗“最优化” ......我不认为你会得到两个

你可以打开文件和读取每一行。 每次你找到一个适合你的标准,它存储在一个变量的时间(更换任何旧实例)。 当你完成,你将有相匹配的最后一行。

你也可以使用一个FileStream设置靠近你的文件末尾的位置。 通过上面的步骤走,如果没有找到匹配,先前设置你的文件流位置在您的文件,直到你找到一个匹配。



Answer 4:

这应该做你要找什么,它可能是内存重为你所需要的,但我不知道你的需求在这方面:

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

它仍然需要阅读在一开始的每一行,但它可能会比在每一个做检查,你这样做的更快。



文章来源: StreamReader.ReadLine() starting from the end of the stream
标签: c# parsing