Читать блок строк в текстовом файле - PullRequest
0 голосов
/ 11 февраля 2019

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

Файл выглядит следующим образом:

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 / error) и столбец для текста (тип данных text).

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Что вы можете сделать, это использовать 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>.*)";

, а затем прочитать каждую строку журнала:

  • match - создать новую запись
  • не совпадает - добавить строку к скользящей записи, предполагается, что у вас есть ошибка

Пример анализа журнала

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}"; }
    }
}
0 голосов
/ 11 февраля 2019

Используйте ReadLine для чтения каждой строки.Например:

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

Теперь для каждой строки вы должны найти первое вхождение пробела (""), разделить по этому индексу и, если это допустимая дата (анализ с определенным форматом), затемиспользуйте это как журнал.В противном случае сохраните строку во временном списке, пока не найдете другую дату

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...