2013-02-19 6 views
0

У меня есть файл журнала, который я хочу представить в DataGridView.Чтение файла журнала в DataGridView

Пример строки данных в файле будет: -

<![LOG[Creating mandatory request for advert 0002124C, program Shutdown Desktops Overnight, package 0000073C]LOG]!><time="05:00:00.192+000" date="02-11-2013" component="execmgr" context="" type="1" thread="3712" file="execreqmgr.cpp:2858"> 

Я хочу, чтобы вытащить из аспектов приведенного выше примера, Log Описание, Время & Дата, компонент, контекст, тип и тему .. и добавить их как столбцы в DataSource DataGridView.

Каков наилучший способ решить эту проблему?

+0

Я редактировал заголовку. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Разделяются ли значения в запятой файла журнала? если это так, разделите значения в List и Bind, которые List , на datagridview или прочитайте значения в наборе данных или datatable и привяжите их таким образом. – MethodMan

+0

Там нет запятой, разделенной помощником, точно так же, как я выше. Это одна строка в файле. Это делает его более неудобным, не уверен, как подойти к нему. – Derek

ответ

0

Я бы предложил подход DJ Kraze: создание пользовательского списка и привязка его к вашему DataGridView. Просто используйте собственный код для разбора строки. Вы также можете использовать DataTable, если это необходимо, однако подход списка обычно более чист.

Нечто подобное (я не проверял точный синтаксис или вызовов методов, так что используйте только в качестве примера, вам понадобится текстовым читатель, например):

public class LogEntry { 
    public string Description { get; set; } 
    public DateTime LogDate { get; set; } 
    // other properties you want to extract 
} 

public class LogReader { 
    public List<LogEntry> ReadLog(string fileName){ 
     var parsedLog = new List<LogEntry>(); 
     using(var file = File.Open(filename, ....)){ 
      while(var line = file.ReadLine()){ 
       var logEntry = ParseLine(line); 
       parsedLog.Add(logEntry); 
      } 
     } 
     return parsedLog; 
    } 

    private LogEntry ParseLine(string line){ 
     var logEntry = new LogEntry(); 
     // go through the line and parse it with string functions and populate values. 
     // I use a helper class, a shortened version is below - note, you might need to 
     //adjust to compile 
     var parser = new StringParser(line); 
     //now just use GetBetween to find the values you need. just pick your delimiters 
     // carefully as the parser will move beyond the end string. But it will go 
     // sequentially so just experiment 
     logEntry.Description = parser.GetBetween("LOG[", "]LOG"); 
     // go through in order 
    } 
} 

public class StringParser { 
    private string text; 
    private int position; 

    public StringParser(string text) 
    { 
     this.Text = text; 
    } 

    public string Text 
    { 
     get { return this.text; } 
     private set 
     { 
      this.text = value; 
      Position = 0; 
     } 
    } 

    public int Position 
    { 
     get { return this.position; } 
     private set 
     { 
      if (value < 0) 
      { 
       this.position = 0; 
      } 
      else 
      { 
       this.position = value > this.Text.Length ? this.Text.Length : value; 
      } 
     } 
    } 

    public bool AtEnd 
    { 
     get { return this.Position >= this.Text.Length; } 
    } 

    public string GetBetween(string beforeText, string afterText) 
    { 
     var startPos = MoveAfter(beforeText); 
     if (startPos == -1) 
     { 
      return ""; 
     } 

     var endPos = FindNext(afterText); 
     return GetBetween(startPos, endPos); 
    } 

    public string PeekBetween(int startPos, int endPos) 
    { 
     if (startPos < 0 || startPos >= this.text.Length) 
     { 
      return ""; 
     } 
     if (endPos < 0 || endPos > this.text.Length) 
     { 
      endPos = this.text.Length; 
     } 
     if (startPos >= endPos) 
     { 
      return ""; 
     } 

     var result = this.text.Substring(startPos, endPos - startPos); 
     return result; 
    } 

    public string GetBetween(int startPos, int endPos) 
    { 
     if (endPos < 0 || endPos > this.text.Length) 
     { 
      endPos = this.text.Length; 
     } 
     var result = PeekBetween(startPos, endPos); 
     if (!string.IsNullOrEmpty(result)) 
     { 
      this.Position = endPos; 
     } 
     return result; 
    } 


    public int FindNext(string searchText) 
    { 
     if (string.IsNullOrEmpty(searchText) || this.AtEnd) 
     { 
      return -1; 
     } 
     return this.text.IndexOf(searchText, this.Position, StringComparison.Ordinal); 
    } 

    public int MoveAfter(string searchText) 
    { 
     var found = FindNext(searchText); 
     if (found > -1) 
     { 
      found += searchText.Length; 
      this.Position = found; 
     } 
     return found; 
    } 
} 
+0

Спасибо за это, его парсинг-часть, с которой я борюсь – Derek

+0

Я добавил сокращенную версию класса StringParser, который я использую в качестве примера. Возможно, вам придется ее отрегулировать, однако вы, как правило, можете получить представление о том, как использовать из него строковые функции. – gabnaim

+0

Я добавлял детали, которые отсутствовали. В основном вы используете строковые функции IndexOf(), чтобы найти начальную и конечную позиции, а затем используйте Substring(), чтобы получить строку между ними. – gabnaim