Как с помощью регулярного выражения разделить данные с файла на 3 элемента массива C#
Есть данные с файла логов, как можно с помощью регулярки разделить на 3 элемента массива
===================================================================
ERROR 2019-11-17 13:06:23.6086 - Thread: (33) - Какой то текст ошибки, Какой то текст ошибки,
Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки!
===================================================================
ERROR 2019-11-17 13:06:23.6086 - Thread: (34) - Какой то текст ошибки, Какой то текст ошибки,
Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой
- то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
- ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,
- Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то
текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки!
===================================================================
ERROR 2019-11-17 13:06:23.6086 - Thread: (35) - Какой то текст ошибки, Какой то текст ошибки,
Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой
то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,
Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то
текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки!
В итоге должно получиться что то такое
["2019-11-17 13:06:23.6086", "(33)", "Какой то текст
ошибки, Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки,Какой то текст ошибки,Какой то текст
ошибки,Какой то текст ошибки!"]
Пробовал разделить так
([=]{2,100}|[A-Z]{4,20}|[A-Z]{4|[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|1-2][0-9]|3[0-1]) [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{4} - [A-Za-z]{1,20}:\((\d+)\) - )^?
но получается слишком много элементов
Ответы (1 шт):
Не знаю зачем вам тут регулярка, все спокойно можно сделать при помощи простых методов языка.
Так, как у вас один лог идет на несколько строк, прочитать файл построчно мы не можем, придется читать целиком и разбивать его. Что у вас является разделителем лога? Наверно
===================================================================. Ок, значит можем смело написать нечто такое:var lines = File.ReadAllText("TextFile1.txt") .Split("===================================================================", StringSplitOptions.RemoveEmptyEntries) .Select(x => x.Trim());StringSplitOptions.RemoveEmptyEntries- это настройка, которая позволит отсечь пустые значения..Select(x => x.Trim())- каждая полученная строка будет обработана при помощи.Trim(), который уберет все лишние пробелы в начале и конце строки.
На этом этапе мы имеем массив из 3-х значений, которые нам надо разбить дальше
Теперь наша задача, это каждую строку разбить на отдельные составляющие. Ищем также разделитель, замечаем, что в тексте данные разделены через
-на 3 блока (тип и дата, поток, текст). Но, разбить просто по символу мы не можем, ведь он встречается даже в дате, а вот текст в виде[пробел]-[пробел]встречается не так часто. Но опять, получаем не то, что нам надо, ведь в тексте тоже подобное встречается, как быть? А все просто, разбиваем только первые 3 участка текста, остальные не трогаем. В итоге мы можем сделать такое:var result = lines.Select(x => x.Split(" - ", 3));Обратите внимание на цифру, это нужный нам ограничитель.
Осталось вытянуть нужные данные, допишем немного код:
var result = lines.Select(x => { var items = x.Split(" - ", 3); var typeAndDate = items[0].Split(' ', 2); var type = typeAndDate[0]; var dateTime = DateTime.Parse(typeAndDate[1]); var thread = int.Parse(items[1].Replace("Thread: (", string.Empty).Trim(')')); return new { Type = type, Date = dateTime, Thread = thread, Message = items[2] }; });
Собственно, как видите, весьма просто можно вытянуть из вашего файла нужные данные, да и без всяких регулярок.


