2010-09-18 5 views
3

У меня есть файл журнала в следующем формате, так как вы можете увидеть каждый запуск журнала с течением времени и заканчиваться трубным делителем.Разбор текстового файла с использованием Linq

Разложите журнала, начиная с DATETIME и заканчивая вертикальной чертой в списке

Как я могу разобрать этот текстовый файл и поместить журналы в коллекции? У меня, кажется, есть проблема в определении того, как я могу найти начало и конец журнала и прочитать его каждый журнал.

Ниже приведен краткий пример, чтобы дать представление о том, что я пытаюсь сделать. Любые указатели помогают и т.д ... действительно оценил

пример журнала

 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

+0

Привет, Стивен. Отлично работает!!! большое спасибо. могу ли я направить свою удачу и задать вам еще один вопрос? У меня есть другой сценарий, когда мне нужно снова прочитать файл, но на этот раз это файл, содержащий заказы, и каждый заказ делится на «================== Как я могу читать снова файл и снова помещаем в коллекцию. См. отредактированный вопрос.Again Спасибо – user451259

+0

Это очень страшный формат, который у вас есть. Вы уверены, что хотите разобрать это? Попробуйте изменить входной файл на что-то более безопасное для синтаксического анализа (XML, например) .Кроме того, хотя я думаю, что это может быть возможно с LINQ, вы, вероятно, лучше используете более императивный подход для анализа такого подхода. Удачи. – Steven

Смежные вопросы