簡體   English   中英

將日志文件讀入DataGridView

[英]Reading log file into 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">

我想提取上面示例的各個方面,日志描述,時間和日期,組件,上下文,類型和線程..並將它們添加為DataGridView的DataSource中的列。

解決此數據的最佳方法是哪種?

我建議DJ Kraze的方法:創建一個自定義列表並將其綁定到您的DataGridView。 只需使用自定義代碼即可解析該行。 如果需要,也可以使用DataTable,但是List方法通常更干凈。

諸如此類的東西(我沒有檢查確切的語法或方法調用,因此僅作為示例,您將需要文本閱讀器):

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;
    } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM