2010-09-18 135 views
3

我有以下格式的日誌文件,您可以看到每個日誌以時間開始並以管道分隔符結束。使用Linq解析文本文件使用Linq解析文本文件

把每個日誌開始日期時間,並在列表與豎線分隔結束

我如何解析這個文本文件,並把日誌的藏品? 我在確定如何找到一個日誌的開始和結束並讀取它的每個日誌似乎有問題

下面是一個快速示例,讓我知道我正在嘗試做什麼。 任何指針幫助等..真的很感激

日誌例如

 08:52:03.260|Error| Stack Trace and other info removed here| 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace| 
     09:52:03.260|Error| Stack Trace and other info removed here| 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace| 
     09:52:03.260|Error|Stack Trace and other info removed here| 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace 
     lots of info about the stack trace| 

文件2方案 我的訂單

 Quantity Description     Price 
     1  shoes     £1.00 
     Total         £1.00 
     No: 34343345  


     ============================================= 
     My Order   


     Quantity Description     Price 
     1  TShirt  £1.00 
     Total         £1.00 
     No: 32234234 



     ============================================ 

計劃:

class Program 
    { 
    static void Main(string[] args) 
    { 
     string path = @"MyTestLog.log"; 
     string aa = string.Empty; 

     List<LogMessage>logMessages=new List<LogMessage>(); 
     using (StreamReader reader = new StreamReader(path)) 
     { 
      //???? 
      logMessages.Add(new LogMessage 
      { 
       Time = ??, 
       ErrorLevel = , 
       Details = ?? 
      }); 
     } 
    } 
} 

public class LogMessage 
{ 
    public DateTime Time { get; set; } 
    public string ErrorLevel { get; set; } 
    public string Details { get; set; } 
    //other stuff here 
} 
+0

與標準的處理方式相比,Linq的性能非常差。所以要小心解析,通常非常依賴於表演。 – 2010-09-18 16:41:40

回答

7

你可能想嘗試這個:

var list = 
    from line in File.ReadAllLines("log.txt") 
    where line.EndsWith("|") 
    let parts = line.Split('|') 
    where parts.Length >= 2 
    where IsDateTime(parts[0]) 
    select new LogMessage() 
    { 
     Time = DateTime.Parse(parts[0]), 
     ErrorLevel = parts[1], 
     Details = parts[2] 
    }; 

而這個簡單的輔助方法:

private static bool IsDateTime(string time) 
{ 
    DateTime temp; 
    return DateTime.TryParse(time, out temp); 
} 

UPDATE: 而當你使用.NET 4.0,你應該使用File.ReadLines而不是File.ReadAllLines。這可以防止將整個文件加載到內存中。

+0

我一直都在使用這種模式。處理CSV或任何結構化文本文件非常棒。 – Slaggg 2010-09-18 15:26:28

+0

嗨史蒂文。它像一個魅力!非常感謝。我可以推動我的運氣並問你另一個問題嗎?我有另一個場景,我需要再次讀取一個文件,但這次是一個文件包含訂單,每個訂單分爲「=================我怎樣才能讀取再次把這個文件放到一個集合中,看看編輯過的問題。再次感謝你 – user451259 2010-09-18 17:39:22

+0

這是一個很嚇人的格式,你確實想要解析它嗎?試着改變輸入文件到更安全的地方來解析例如XML),另外,雖然我認爲可以使用LINQ,但您可能更願意使用更強制性的方法來解析這種方法。祝您好運。 – Steven 2010-09-18 18:00:47