Нужна помощь в разборе файла для этого шаблона "Feb 06 2010 15: 49: 00.017 MCO" - PullRequest
1 голос
/ 02 марта 2010

Необходимо проанализировать файл для строк данных, которые начинаются с этого шаблона "06.02.2010 15: 49: 00.017 MCO", где MCO может быть любым трехбуквенным идентификатором, и вернуть всю запись для строки. Я думаю, что мог бы получить первую часть, но возвращение остальной части строки - то, где я теряюсь.

Вот некоторые примеры данных.

06.02.2010 15: 49: 00.017 MCO -I -I -I -I 0,34 527 0,26 0,24 184 Предварительно 0,00 0 Только радар -RDR- - - - - № 282356N 0811758W - 3-3
06.02.2010 15: 49: 00.017 MLB -I -I -I -I 44.31 3175 -10.05 -10.05 216 Установлено 0.00 0 Только радар -RDR- - - - - № 281336N 0812939W - 2-
06.02.2010 15: 49: 00.018 MLB -I -I -I -I 44.31 3175 -10.05 -10.05 216 Установлено 15,51 99 Только радар -RDR- - - - № 281336N 0812939W - 2-
06.02.2010 15: 49: 00.023 QML N856 7437-V -I 62-V 61-V 67.00 3420 -30.93 15,34 534 Установлено 328.53 129 Усилено - - - - - - № 283900N 0815325W - -
06.02.2010 15: 49: 00.023 QML N516SP 0723-V -I 22-V 21-V 42.25 3460 -8.19 5.03 146 Установлено 243.93 83 Только маяк - - - - - - № 282844N 0812734W - -
06.02.2010 15: 49: 00.023 QML 2247-V -I 145-V 144-V 78,88 3443 -39,68 23,68 676 Установлено 177,66 368 Усилено - - - - - - № 284719N 0820325W - -
06.02.2010 15: 49: 00.023 MLB 1200-V -I 15-V 14-V 45,25 3015 -11,32 -20,97 475 Установлено 349,68 88 Только маяк - - - - - - № 280239N 0813104W - -
06.02.2010 15: 49: 00.023 MLB 1011-V -I 91-V 90-V 94.50 3264 -56,77 10,21 698 Установлено 152,28 187 Только маяк - - - - - - № 283341N 0822244W - -
- - - - - -

Ответы [ 2 ]

0 голосов
/ 03 марта 2010

похоже на вашу дату + 3 символа - это всегда первые 5 полей (с пробелом в качестве разделителя). Просто просмотрите файл и сделайте разделение на каждую строку. Тогда получите первые 5 полей

s=Split(strLineOfFile," ")
wscript.echo s(0),s(1),s(2),s(3),s(4)

Не нужно регулярное выражение

0 голосов
/ 02 марта 2010

Из ваших примеров данных кажется, что вам не нужно проверять наличие трехбуквенного идентификатора после даты - он всегда здесь. Добавьте последние три буквы в регулярное выражение, если это неверное предположение. Кроме того, добавьте больше группировок по мере необходимости, чтобы группы регулярных выражений были полезны для вас. В любом случае:

import re
dtre = re.compile(r'^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]{2} [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}')

[line for line in file if dtre.match(line)]

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

Другой возможностью было бы использование выражения-генератора вместо понимания списка (для этого нужно заменить внешние [ и ] на ( и )). Это полезно, если вы выводите результаты куда-то на ходу, файл большой и вам не нужно хранить все это в памяти для разных целей. Только не закрывайте файл, прежде чем использовать весь генератор, если вы используете этот подход!

Кроме того, вы можете использовать встроенную функцию разбора datetime:

import datetime

for line in file:
    try:
        # the line[:24] bit assumes you're always going to have three-digit
        # µs part
        dt = datetime.datetime.strptime(line[:24], '%b %d %Y %H:%M:%S.%f')
    except ValueError:
        # a ValueError means the beginning of the line isn't parseable as datetime
        continue
    # do something with the line; the datetime is already parsed and stored in dt

Вероятно, будет лучше, если вы все равно создадите объект datetime.datetime.

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