[英]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.