Разбор текстового файла в поля с использованием нескольких типов разделителей - PullRequest
3 голосов
/ 17 февраля 2011

Я пытаюсь проанализировать файлы журнала из чата с помощью c #, проблема, с которой я сталкиваюсь, заключается в том, что он не предназначен для анализа, так как не использует стандартные разделители. Вот пример типичной строки из файла:

 2010-08-09 02:07:54 [Message] Skylar Morris -> (ATL)City Waterfront: I'll be right back 
 date time messageType userName -> roomName: message

Поля, которые я хотел бы сохранить: Дата и время объединились как тип DateTime

MessageType

имя_пользователя

roomName

сообщение

Если бы его можно было разделить стандартным разделителем, таким как пробел, табуляция или запятая, это было бы довольно просто, но я не знаю, как его атаковать.


Как продолжение, используя этот код в качестве шаблона:

List<String> fileContents = new List<String>();
string input = @"2010-08-09 02:07:54 [Message] Skylar Morris -> (ATL)City Waterfront: I'll be right back";
string pattern = @"(.*)\[(.*)\](.*)->(.+?):(.*)";

foreach (string result in Regex.Split(input, pattern))
{
   fileContents.Add(result.Trim());
}

Я получаю 7 элементов (один пустой до и после) из 5 ожидаемых. Как я могу исправить это?

foreach (string result in Regex.Split(input, pattern)
        **.Where(result => !string.IsNullOrEmpty(result))**)
{
   fileContents.Add(result.Trim());
}

Хорошо, удалось решить с помощью приведенного выше кода.

Ответы [ 2 ]

5 голосов
/ 17 февраля 2011

Вы знаете старую поговорку о том, что «Некоторые люди, сталкиваясь с проблемой, думают:« Я знаю, я буду использовать регулярные выражения. «Теперь у них две проблемы».

ну, в этом случае вам действительно нужны регулярные выражения.

этот должен охватывать вас в этом случае:

([\d]{4}-[\d]{2}-[\d]{2} [\d]{2}:[\d]{2}:[\d]{2}) \[([\w]+)\] ([a-zA-Z0-9 ]+) -> (\([\w]+\)[a-zA-Z0-9 ]+): (.*)

Вы должны действительно проверить это все же. Я просто бросил это воедино, и, возможно, он не справляется со всем, что вы могли видеть.

2 голосов
/ 17 февраля 2011

Попробуйте это:

.*\[(.*)\](.*)->(.+?):(.*)

Используется тот факт, что сообщение в квадратных скобках [] имя между [] и -> имя комнаты между -> и: и сообщение это все потом. :)

...