我在C#/。NET的工作和我解析文件,以检查是否一行特定的正则表达式匹配。 其实,我要找到匹配的最后一行。
为了让我的文件的行,我目前使用的System.IO.StreamReader.ReadLine()方法,但我的文件是非常巨大的,我想优化位代码,并从文件末尾开始。
有谁知道是否有在C#/。NET类似功能的ReadLine()从流的末尾开始? 如果没有,会是什么,你的头脑,要做到上述工作的最简单和最优化的方式?
我在C#/。NET的工作和我解析文件,以检查是否一行特定的正则表达式匹配。 其实,我要找到匹配的最后一行。
为了让我的文件的行,我目前使用的System.IO.StreamReader.ReadLine()方法,但我的文件是非常巨大的,我想优化位代码,并从文件末尾开始。
有谁知道是否有在C#/。NET类似功能的ReadLine()从流的末尾开始? 如果没有,会是什么,你的头脑,要做到上述工作的最简单和最优化的方式?
真奇怪你会提到它 - 是的,我有。 我写了一个ReverseLineReader
前一阵子,并把它放在MiscUtil 。
这是在回答这个问题上堆栈溢出-答案包含代码,尽管它使用MiscUtil等位了。
它只会用一些编码处理,但希望所有你需要的人。 请注意,这会比从文件开始阅读,如果你有阅读整个文件效率较低 - 各种各样的东西可以假设通过文件向前运动,所以他们对于优化。 但如果你实际上只是读附近的文件的末尾行,这可能是一个巨大的胜利:)
(不知道这是否应该刚刚接近的选票或不...)
由于您使用正则表达式,我认为你最好的选择将是读整行到内存中,然后尝试匹配。
或许,如果你提供给我们的正则表达式的文件内容的示例中,我们可以找到一个更好的办法来解决问题。
“最简单”的航班吗“最优化” ......我不认为你会得到两个
你可以打开文件和读取每一行。 每次你找到一个适合你的标准,它存储在一个变量的时间(更换任何旧实例)。 当你完成,你将有相匹配的最后一行。
你也可以使用一个FileStream设置靠近你的文件末尾的位置。 通过上面的步骤走,如果没有找到匹配,先前设置你的文件流位置在您的文件,直到你找到一个匹配。
这应该做你要找什么,它可能是内存重为你所需要的,但我不知道你的需求在这方面:
string[] lines = File.ReadAllLines("C:\\somefilehere.txt");
IEnumerable<string> revLines = lines.Reverse();
foreach(string line in revLines) {
/*do whatever*/
}
它仍然需要阅读在一开始的每一行,但它可能会比在每一个做检查,你这样做的更快。