Разбор несогласованного файла журнала - PullRequest
1 голос
/ 21 января 2011

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

Файл журнала имеет формат Категория: Информация

Case Number: CASE01  
User ID: JOSM  
Software: Microsoft Word  
Date Started: 21-01-2010  
Date Ended: 22-01-2010  

Дело в том, что в файл журнала добавлены другие фрагменты, которые означают, что информация не 't всегда присутствует на одной строке.Я тоже хочу только информацию, а не категорию.

До сих пор я пытался вставить все это в массив, разделенный \ r \ n, но я должен знать индекс информации, которую я хочу, чтобы последовательно получать ее, и это меняется.Я также попытался передать его через StreamReader и сказать

if (line.Contains("Case Number"))
{
    tbReport.AppendText("Case Number: " + line.Remove(0, 13) + "\r\n");
}

, который дает мне информацию, которую я хочу, но с которой очень трудно что-либо делать.

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

ОднаждыЯ могу разобрать его точно, добавить его в базу данных должно быть довольно просто.Поскольку я впервые пытаюсь это сделать, меня будут интересовать любые советы или рекомендации относительно того, как лучше всего это сделать.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 21 января 2011

Это даст вам коллекцию со всеми парами ключ / значение.

List<KeyValuePair> items = new List<KeyValuePair>();

var line = reader.ReadLine();
while (line != null)
{
    int pos = line.IndexOf(':');
    items.Add(new KeyValuePair(line.Substring(0, pos), line.Substring(pos+1));

    line = reader.ReadLine();
}

Если у вас есть класс журнала, который содержит все возможные имена в качестве свойств, вы можете использовать отражение вместо:*

Обратите внимание, что я не проверял код (просто написал его прямо здесь).Вы должны добавить проверку ошибок и тому подобное.Последняя альтернатива не очень эффективна, но должна быть в порядке.

0 голосов
/ 21 января 2011

Это на самом деле не простой ответ, но вы, возможно, хотя бы об использовании регулярного выражения для анализа информации?

Регулярные выражения - довольно хардкорные вещи, но они могут довольно легко анализировать расширенные файлы.

Так что в том, что я вижу, то это похоже на:

Если строка начинается с A-Z, то (a-z или A-Z или 0-9 или пробел) от нуля до много раз, затем следует:: затем пробел, а затем значение.

Так что, если вы сделаете регулярное выражение для этого (если вы подождете некоторое время, я постараюсь сделать его для вас), то вы можете проверить каждую строку с этим. Если это совпадает, то мы также можем использовать регулярные выражения, чтобы вывести последнюю часть, и «ключ». Если он не совпадает, мы просто добавляем его к последнему ключу.

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

Как и было обещано, вот отправная точка для вашего регулярного выражения:

^(?'key'[A-Z][a-z,A-Z,0-9,\s]+):\s(?'value'.+)

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

  • ^ гарантирует, что совпадение начинается в начале строки
  • (? 'Key' - это синтаксис для начала группы "capture". Регулярное выражение затем даст нам доступ, чтобы легко вынуть "key" часть регулярного выражения.
  • Мы с [A-Z] - это группа, которая будет соответствовать любой большой букве. Но только один
  • [az, AZ, 0-9, \ s] + - аналогично предыдущей группе, но только для всех больших или маленьких букв, цифр и пробелов (\ s), плюс вне группа сообщает, что может соответствовать более чем одному.
  • Затем мы просто заканчиваем группу и выводим *: , а затем пробел.
  • Затем мы начинаем новую группу - группу value , точно так же, как группу ключей.
  • Затем мы просто пишем . (это означает все), а затем просто + после этого, чтобы он поймал более одного

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

RegEx.Matches (или что-то в этом роде) и цикл по ним.

Затем просто возьмите match.Groups ["key"] и match.Groups ["value"] и поместите в ваш массив. (Извините, у меня нет Visual Studio под рукой, чтобы проверить это)

0 голосов
/ 21 января 2011

Звучит как хороший кандидат в RegExp:

http://www.regular -expressions.info / dotnet.html

Их не так-то легко выучить, но как только вы поймете основы, их нельзя будет победить для такого рода задач.

...