2014-11-07 3 views
0

У меня возникли трудности с разбором ASCII, который выглядит ниже. Мне нужно создать массив, названный как первый алфавитный элемент в строке комментария (начинается с '-'), и добавить к нему все числа между этой строкой комментария и строкой '/'. В файле может быть несколько таких записей.Сложный анализ ASCII-файлов с помощью Python

-- LIQ units - sm³/day (8 values) 
    500.0 1000.0 1500.0 2000.0 3000.0 
4000.0 5000.0 6000.0/

-- GRAT units - sm³/day (7 values) 
    0.0 200000.0 400000.0 600000.0 800000.0 
999999.9 1200000.0/

, например, я ожидаю получить liq = [500.0, 1000.0, 1500.0, 2000.0, 3000.0, 4000.0, 5000.0, 6000.0]

+0

Вы действительно хотите, чтобы * переменные имена * были динамическими ??? Это довольно необычное требование. Кроме этого, PLY (Python Lex Yacc) - очень мощный инструмент для разбора текстовых файлов. –

+0

Хотя это не абсолютная необходимость, это сильное предпочтение. Обычно количество таких заголовков меньше 6, но их имена могут отличаться. – sychuanj

ответ

1

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

Вы можете разобрать строки один за другим и проверить, начинается ли линия с '-' после того, как вы найдете такую ​​строку, вам нужно разобрать остальную часть строк, пока не получите '\' на Конец строки.

и повторить процесс снова до конца файла

что-то похожее на это будет работать

import re 
pat = re.compile(r'^--\s*(?P<name>\w+).*') 

def get_data(file): 
    '''gets the numbers till you find "/" 
    ''' 
    arr = [] 
    for line in file: 
     numbers = line.split() 
     if numbers[-1] == '/': 
      arr.extend(numbers[:-1]) 
      break 
     else: 
      arr.extend(numbers) 
    return arr 

for line in file: 
    if line.startswith('--'): 
     name = pat.match(line).groups()[0] 
     arrays[name] = get_data(file) 

это возвращает словарь формата:

'GRAT': ['0.0', 
    '200000.0', 
    '400000.0', 
    '600000.0', 
    '800000.0', 
    '999999.9', 
    '1200000.0'], 
'LIQ': ['500.0', 
    '1000.0', 
    '1500.0', 
    '2000.0', 
    '3000.0', 
    '4000.0', 
    '5000.0', 
    '6000.0']} 

для входа вы дали

Пожалуйста, позаботьтесь о краях и исключении h перед использованием кода,

удачи!

+0

Большое спасибо, он делает работу так, как мне нужно! Словарь действительно полезен и прост здесь. – sychuanj

+0

Могу я задать небольшой вопрос: как бы выглядела ваша функция get_data, если между записями не было пустых строк? – sychuanj

+0

Предполагая, что записи по-прежнему разделены символом новой строки, не имеет значения, нет ли пустых строк между записями. программа по существу ищет куски файла, который начинается с «-» и заканчивается на «/». – srj

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