2013-05-27 2 views
0

У меня есть файл с следующими данными:Синтаксический шаблон строки (Python)

<<row>>12|xyz|abc|2.34<</row>> 
<<eof>> 

Файл может иметь несколько строк, как это. Я пытаюсь создать парсер, который будет анализировать каждую строку, присутствующую в этом файле, и возвращать массив со всеми строками. Какой был бы лучший способ сделать это? Код должен быть написан на python. Код не должен принимать строки, которые не начинаются с <<row>>, или должны вызывать ошибку.

=======> UPDATE < ========

Я просто нашел, что конкретный <<row>> может занимать несколько строк. Поэтому мой код и приведенный ниже код больше не работают. Может ли кто-нибудь предложить эффективное решение?

Файлы данных могут содержать от нескольких сотен до нескольких тысяч строк.

+3

Похоже, довольно простой задачей. Где у вас проблемы? – GolfWolf

+0

Это простая задача, которую я знаю, но я хочу знать, как ее решит другой программист. Так. –

+1

Опубликуйте решение, которое у вас уже есть. Вы посоветуете, как улучшить его. –

ответ

1

Простой способ без регулярных выражений:

output = [] 
with open('input.txt', 'r') as f: 
    for line in f: 
     if line == '<<eof>>': 
      break 
     elif not line.startswith('<<row>>'): 
      continue 
     else: 
      output.append(line.strip()[7:-8].split('|')) 

Это использует каждую строку, начинающуюся с <<row>>, пока строка не содержит только <<eof>>

1
def parseFile(fileName): 
    with open(fileName) as f: 

    def parseLine(line): 
     m = re.match(r'<<row>>(\d+)\|(\w+)\|(\w+)\|([\d\.]+)<</row>>$', line) 
     if m: 
     return m.groups() 

    return [ values for values in (
     parseLine(line) 
     for line in f 
     if line.startswith('<<row>>')) if values ] 

И? Разве я другой? ;-)

+0

Думаю. Но я считаю, что делать это без использования регулярных выражений. –

+0

Почему вы так поверили? Regexp более общий. Использование 'split' и т. Д. Всегда использует специальную версию для специального случая. В случае, если в будущем появится немного измененная версия формата, настройка регулярного выражения является cinch при составлении новой версии с использованием более простых механизмов синтаксического анализа, которая быстро не справляется с задачей. – Alfe

+0

Строковая библиотека быстрее. Поэтому для меня было бы более целесообразным сделать это, не используя регулярное выражение, поскольку эти файлы будут содержать тысячи строк. Эти файлы содержат данные, которые мы покупаем у поставщика данных, поэтому у меня нет выбора в отношении формата входных данных. –

Смежные вопросы