2009-07-09 68 views
1

我在C#/ .NET中工作,我正在解析一個文件來檢查一行是否與特定的正則表達式匹配。其實,我想找到最後的那條線。StreamReader.ReadLine()從流的末尾開始

爲了得到我的文件的行,我目前使用的是System.IO.StreamReader.ReadLine()方法,但由於我的文件非常大,我想優化一下代碼並從結尾開始的文件。

有誰知道是否有在C#/。NET類似的函數ReadLine()從流的末尾開始?如果不是,那麼在你的想法中,做上述工作的最簡單和最優化的方法是什麼?

回答

6

奇怪你會提到它 - 是的,我有。前段時間我寫了一個ReverseLineReader,並把它放在MiscUtil

Stack Overflow回答了this question - 答案中包含代碼,儘管它也使用了MiscUtil的其他位。

它只會用一些編碼處理,但你需要所有希望的那些。請注意,如果您需要閱讀整個文件,這將比從文件開頭讀取效率低 - 所有類型的文件都可能會通過文件進行向前移動,因此它們已針對該文件進行了優化。但如果你實際上只是讀附近的文件的末尾行,這可能是一個巨大的勝利:)

(不知道這是否應該剛剛接近的選票或不...)

+0

很高興地看到,任何人都可以忘記關閉或處置。 :) – MusiGenesis 2009-07-09 16:58:30

+1

+1對於你的LineReader是多麼徹底。感謝您使這個東西可用<3 – womp 2009-07-09 17:03:37

0

由於您使用的是正則表達式,我認爲您最好的選擇是將整行讀入內存然後嘗試匹配它。

也許如果您向我們提供正則表達式和文件內容的示例,我們可以找到更好的方法來解決您的問題。

0

「最簡單」-vs-「最優化」...我不認爲你會得到兩個

你可以打開文件並閱讀每一行。每次找到符合條件的標記時,將其存儲在一個變量中(替換以前的任何實例)。當你完成時,你將有最後一行匹配。

你也可以使用一個FileStream設置靠近你的文件末尾的位置。執行上述步驟,如果找不到匹配項,請在文件中將FileStream的位置設置得更早,直到找到匹配項。

0

這應該做你要找什麼,它可能是內存重爲你所需要的,但我不知道你的需求是在該地區:

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

它仍然需要在開始時閱讀每一行,但這可能比檢查每一行更快。

相關問題