2009-07-17 19 views
2

我必須逐行讀取一個日誌文件。它大小約6MB,總計40000行。但是在測試我的程序之後,我發現該日誌文件僅由LF字符分隔。所以我不能用Readline的方法StreamReader如何閱讀僅由LF分隔的文件中的每一行?

我該如何解決這個問題?

編輯:我試圖用文本閱讀器,但我的計劃仍然沒有奏效:

using (TextReader sr = new StreamReader(strPath, Encoding.Unicode)) 
      { 


       sr.ReadLine(); //ignore three first lines of log file 
       sr.ReadLine(); 
       sr.ReadLine(); 

       int count = 0; //number of read line 
       string strLine; 
       while (sr.Peek()!=0) 
       { 
        strLine = sr.ReadLine(); 
        if (strLine.Trim() != "") 
        { 
         InsertData(strLine); 
         count++; 
        } 
       } 

       return count; 
      } 

回答

4

不File.ReadAllLines(文件名)與LF行結束無法正確加載文件?如果你需要整個文件,可以使用它 - 我看到一個網站指出它比另一個方法慢,但是,如果你傳遞了正確的編碼(默認是UTF-8),那麼這個網站並不是那麼簡單,再加上它就像你可以得到的一樣乾淨。

編輯:它的確如此。如果你需要流媒體,TextReader.ReadLine()也可以正確處理Unix行結束。

再次編輯:StreamReader也是如此。你只是檢查文件,並認爲它不會處理LF行結束?我正在尋找Reflector,它確實看起來像一個適當的處理程序。

+0

實際上文件很大。我必須逐行閱讀後處理 – Vimvq1987 2009-07-17 08:39:05

+0

@ Vimvq1987(4年後...),但這是如何解決您的問題? IOW,如果這是正確的,你的代碼因其他原因失敗。出於好奇(如果你還記得)它是什麼? – 2013-02-08 18:09:43

8

TextReader.ReadLine已處理僅由\n終止的行。

the docs

的線被定義爲 字符,隨後是滑架 返回(0x000d),換行(0x000a) 回車後跟行 進料的序列,Environment.NewLine或流標記的結尾 。返回的 字符串不包含終止回車和/或 換行的 。如果已經達到輸入流 的末尾,則返回的值爲 空引用(基於Visual 中的Nothing)。

所以基本上,你應該沒問題。 (我已經談到TextReader而不是StreamReader,因爲這是在方法聲明 - 顯然它仍然可以與StreamReader工作)

如果你想通過線輕鬆迭代(和潛在使用LINQ對日誌文件)你可能會發現我的LineReader類在MiscUtil有用。它基本上將調用ReadLine()包裝在迭代器中。因此,舉例來說,你可以這樣做:

var query = from file in Directory.GetFiles("logs") 
      from line in new LineReader(file) 
      where !line.StartsWith("DEBUG") 
      select line; 

foreach (string line in query) 
{ 
    // ... 
} 

所有流:)

+0

我的程序仍然沒有工作。我不知道出了什麼問題:( – Vimvq1987 2009-07-17 09:04:34

0

我已經猜到\ LF(\ n)的就可以了(而\ CR(\ r) - 只可能會導致問題)。

您可以一次讀取每行字符並在讀取終止符時處理它。

分析後,如果這太慢,那麼你可以使用應用程序端緩衝與讀([])。但首先嚐試簡單的角色!

0

或者您可以使用Readblock方法並自行解析線