2013-06-24 8 views
-1

Я пытаюсь проанализировать файл excel. В этом файле excel есть определенные «заголовки» (они находятся внутри ячеек), которые содержат конкретные имена устройств. Каждое из этих имен содержит акроним, окруженный скобками. Между каждым «заголовком» имеются пробелы между данными для этого устройства, расположенного между двумя устройствами. Однако не все «заголовки» расположены в одной колонке, поэтому я не могу просто сканировать один жесткий кодированный столбец.Python Регулярное выражение Поиск данных

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

Header_A [HDA] 
    data 
    data 
    data 
    data 
Header_B [HDB] 
    data 
    data 
    data 
    data 
    Header_C [HDC] 
     data 
     data 
     data 
     data 
+0

Итак, каков ожидаемый результат? – HamZa

+0

Я хотел бы иметь список или словарь, который имеет Header_A и все его данные либо как пару ключей, либо пару в одной «ячейке» списка [[Header_A [HDA], данные, данные, данные, данные], [Header_B, data, data, ...], ...] – shreddish

+1

Взгляните на это. Предлагает возможные обходные пути, чтобы избежать синтаксического анализа файлов excel: http://www.joelonsoftware.com/items/2008/02/19.html –

ответ

0

Ну, это может быть переобучения ваш образец, но он подходит ваш образец:

(питон 3)

sample= '''Header_A [HDA] 
    data 
    data 
    data 
    data 
Header_B [HDB] 
    data 
    data 
    data 
    data 
    Header_C [HDC] 
     data 
     data 
     data 
     data''' 

lines=[{'raw':x} for x in sample.split('\n')] 
largestIndent=0 
for line in lines: 
    line['indent']= (len(line['raw'])-len(line['raw'].lstrip()))//4 
    line['content']= line['raw'].lstrip() 
    if line['indent']>largestIndent: 
     largestIndent=line['indent'] 
lines=[{'indent':-1, 'content':'', 'raw':''}] + lines 

for depth in range(largestIndent,-1,-1): 
    print ('depth={}'.format(depth)) 
    #print ('lines before ={}'.format(lines)) 
    children=[] 
    for line in lines[::-1]: 
     if line['indent']==depth: 
      children=[line['content']]+children 
     elif line['indent']==depth-1: 
      if children !=[]: 
       line['content']=[line['content']] + children 
      children=[] 
     else: 
      pass 
    #print ('lines after ={}'.format(lines)) 

outList=lines[0]['content'][1:] 

print(outList) 

Выход:

[['Header_A [HDA]', 'data', 'data', 'data', 'data'], ['Header_B [HDB]', 'data', 'data', 'data', 'data', ['Header_C [HDC]', 'data', 'data', 'data', 'data']]] 

Нет регулярных выражений!

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

+0

ценят, что вы тратите время, чтобы написать все это, но я бы сканировал его из файла excel ... из того, что я могу сказать, что вы сканируете из текстового файла? – shreddish

+0

@reddman: Моя просто закодирована образец, который вы предоставили с вопросом (как текст). Если вы на самом деле собираетесь разбирать двоичный файл xls, я не знаю, с чего начать. См. Мой комментарий по вопросу о возможном обходном пути. –

+0

@reddman - Возможно, вы захотите рассмотреть возможность использования библиотеки [xlrd library] (http://www.python-excel.org). –