2010-09-08 81 views
1

我有一個日誌文件可以變得非常大。如何讀取特定格式的數據

我的日誌文件中的信息是以某種格式存在的,我想將它們分隔成一個獨立的數據塊。

例如,

這是開始。

等等等等

等等等等等等等等等等等等

胡說

這是開始。

等等等等

等等等等等等等等等等等等

等等等等等等等等等等等等

等等等等等等等等等等等等

胡說

我想要得到的信息從「這是起點」到下一個「這是起點」開始之前。做這個的最好方式是什麼?我的代碼是在C#中。

+0

線是由一個新的行分開? – halfdan 2010-09-08 00:47:18

+0

可能會或可能不會。除「這是開始」外,沒有這種格式。 – user393148 2010-09-08 00:55:58

回答

1

下面的代碼將所述文件分割成由"This is the start."線劃定的塊,並調用的回調方法來處理每個數據塊:

public static void ProcessInChunks(string inputFilename, 
    string delimiter, Action<IEnumerable<string>> processChunk) 
{ 
    using (var enumerator = File.ReadLines(inputFilename).GetEnumerator()) 
    { 
     if (!enumerator.MoveNext()) 
      // The file is empty. 
      return; 

     var firstLine = enumerator.Current; 
     if (firstLine != delimiter) 
      throw new InvalidOperationException(
       "Expected the first line to be a delimiter."); 

     List<string> currentChunk = new List<string>(); 

     while (enumerator.MoveNext()) 
     { 
      if (enumerator.Current == delimiter) 
      { 
       processChunk(currentChunk); 
       currentChunk = new List<string>(); 
      } 
      else 
       currentChunk.Add(enumerator.Current); 
     } 
     processChunk(currentChunk); 
    } 

用法:

ProcessInChunks(@"myfile.log", "This is the start.", 
    chunk => { /* do something here */ }); 
+0

感謝Timwi的回答。我會試試這個。我的另一個問題是,這是閱讀大文件的最佳方式嗎? – user393148 2010-09-08 00:56:37

+0

@ user393148 - 對於編程中的一大類問題,沒有簡單而直接的答案。你總是需要看看每個人的情況。我剛剛編輯了這個答案,以使它對於非常大的文件更加高效。我以前的版本會將整個文件加載到內存中,但新版本會逐步處理它。 – Timwi 2010-09-08 01:14:36

+0

謝謝Timwi ... – user393148 2010-09-08 17:56:33

0

如果可以」不會改變日誌創建過程,@Timwi的答案會很好。如果您可以調整日誌創建過程,則可以在每次要寫入This is the start.時創建新的日期標記日誌文件名。這將創建多個日誌文件,但它們已經以所需的方式分割。顯然如果找到的文本可以改變,這將無法工作。

+0

謝謝愛德華。我正在努力將其變爲標準格式。在此之前,我必須使用解決方法。謝謝 – user393148 2010-09-08 17:48:38

相關問題