读取文本文件中的行

时间:2019-02-11 14:46:01

标签: c# loops text-files logfile

我正在编写一个程序来读取日志文件。每个条目都以时间戳记开头,除​​非出现错误,否则在这种情况下,我将有多行错误消息且没有时间戳记。

文件如下:

20190207 14:23:10.123 info Read input
20190207 14:23:11.001 info connecting to database
20190207 14:23:17.101 error truncating the table customer. Error code XXXX
the file was blocked.

我想将每个条目及其时间戳,事件类型和消息存储在一个表中,该表具有三列,一列用于时间戳记(datetime),另一列用于事件(info / warning /错误),以及一列文字(数据类型文字)。

我如何遍历文件并读取包括错误消息的所有条目,有时有时会出现在多行中?

2 个答案:

答案 0 :(得分:0)

您可以做的是使用Regex来尝试匹配日志的每一行。如果匹配,则创建条目,否则将行附加到现有条目上。我将提供代码以尝试解释方法...

//strings for simplification, in your code you should use DateTime and parse properly
public class Entry
{
    public string Timestamp { get; set; }
    public string Type { get; set; }
    public string Description { get; set; }
}

然后,您可以定义regular expression来捕获日志行。我使用组进行了此操作,因此更容易从中提取数据。请注意,您应该添加所有期望的类型,我只使用info|error|warning

//you should define all types you expect in log, I just put info and error
string LogLineRegex = @"(?<date>\d{4}\d{2}\d{2} \d{2}:\d{2}:\d{2}.\d{3}) (?<type>info|error|warning) (?<text>.*)";

然后阅读日志的每一行:

  • 匹配-创建新条目
  • 不匹配-将行追加到滚动条目,假设您有错误

日志解析示例

Entry rollingEntry = null;

foreach (var line in log)
{
    var match = Regex.Match(line, LogLineRegex);

    if (match.Success)
    {
        if (rollingEntry != null) { entries.Add(rollingEntry); }

        rollingEntry = new Entry{ 
            Timestamp = match.Groups["date"].ToString(),
            Type = match.Groups["type"].ToString(),
            Description = match.Groups["text"].ToString() };
    }
    else
    {
        if (rollingEntry != null) { rollingEntry.Description += $"{Environment.NewLine}{line}"; }
    }
}

答案 1 :(得分:-4)

使用ReadLine来读取每一行。 例如:

while((line = file.ReadLine()) != null)  
{  
    // some code here  
}

现在,对于每一行,您都必须找到第一个出现的空格(“”),在该索引处分割,如果它是有效日期(使用特定格式解析),则将其用作日志。 否则,请将该行保留在临时列表中,直到找到另一个日期为止