我在C#/ .NET中工作,我正在解析一個文件來檢查一行是否與特定的正則表達式匹配。其實,我想找到最後的那條線。StreamReader.ReadLine()從流的末尾開始
爲了得到我的文件的行,我目前使用的是System.IO.StreamReader.ReadLine()方法,但由於我的文件非常大,我想優化一下代碼並從結尾開始的文件。
有誰知道是否有在C#/。NET類似的函數ReadLine()從流的末尾開始?如果不是,那麼在你的想法中,做上述工作的最簡單和最優化的方法是什麼?
我在C#/ .NET中工作,我正在解析一個文件來檢查一行是否與特定的正則表達式匹配。其實,我想找到最後的那條線。StreamReader.ReadLine()從流的末尾開始
爲了得到我的文件的行,我目前使用的是System.IO.StreamReader.ReadLine()方法,但由於我的文件非常大,我想優化一下代碼並從結尾開始的文件。
有誰知道是否有在C#/。NET類似的函數ReadLine()從流的末尾開始?如果不是,那麼在你的想法中,做上述工作的最簡單和最優化的方法是什麼?
奇怪你會提到它 - 是的,我有。前段時間我寫了一個ReverseLineReader
,並把它放在MiscUtil。
Stack Overflow回答了this question - 答案中包含代碼,儘管它也使用了MiscUtil的其他位。
它只會用一些編碼處理,但你需要所有希望的那些。請注意,如果您需要閱讀整個文件,這將比從文件開頭讀取效率低 - 所有類型的文件都可能會通過文件進行向前移動,因此它們已針對該文件進行了優化。但如果你實際上只是讀附近的文件的末尾行,這可能是一個巨大的勝利:)
(不知道這是否應該剛剛接近的選票或不...)
由於您使用的是正則表達式,我認爲您最好的選擇是將整行讀入內存然後嘗試匹配它。
也許如果您向我們提供正則表達式和文件內容的示例,我們可以找到更好的方法來解決您的問題。
「最簡單」-vs-「最優化」...我不認爲你會得到兩個
你可以打開文件並閱讀每一行。每次找到符合條件的標記時,將其存儲在一個變量中(替換以前的任何實例)。當你完成時,你將有最後一行匹配。
你也可以使用一個FileStream設置靠近你的文件末尾的位置。執行上述步驟,如果找不到匹配項,請在文件中將FileStream的位置設置得更早,直到找到匹配項。
這應該做你要找什麼,它可能是內存重爲你所需要的,但我不知道你的需求是在該地區:
string[] lines = File.ReadAllLines("C:\\somefilehere.txt");
IEnumerable<string> revLines = lines.Reverse();
foreach(string line in revLines) {
/*do whatever*/
}
它仍然需要在開始時閱讀每一行,但這可能比檢查每一行更快。
很高興地看到,任何人都可以忘記關閉或處置。 :) – MusiGenesis 2009-07-09 16:58:30
+1對於你的LineReader是多麼徹底。感謝您使這個東西可用<3 – womp 2009-07-09 17:03:37