2012-04-23 12 views
0

これは良いアルゴリズムだとわかっていますが、見つけにくいです。属性の構文解析用のアルゴリズム(形式の不適切なもの)

解析する必要のあるツール(その出力スタイルでは制御できない)からの出力(フォーマットが不適切)です。

それは次のようになります。NameOfItemXとattributeXが知られている名前の明確に定義された一連のある

NameOfItemA 
attribute1 = values1 
attribute2 = values2 
... 
attributen = valuesn 
NameOfItemB 
attribute1 = values1 
attribute2 = values2 
... 
attributen = valuesn   

。合理的なオブジェクトにそれを有効にする必要があり:

ObjectForA.attribute1 = values1 

など

私はちょうど私がそれをやったか覚えてカント、前にこれをやった知っています。もちろん

class obj(object): pass 
items={} 
for line in textinput: 
    if(line.find("NameOfItem")!=-1): 
     current_object=items[line.replace("NameOfItem","")]=obj() 
    else: 
     attr,val=line.split('=',1) 
     setattr(current_object,attr.strip(),val.strip()) 

すでにあれば、あなたは基本的なオブジェクトをOMMITことができます:私が作るセンスを言ってやだ何を誰かが

+0

属性行は、常にそれらの中に ' '=''性格を持っていますか? –

答えて

0

かについて助けることができますうまくいけば

for line in textinput: 
    if line.find("NameOfItem"): 
     ... parse until next one ... 

:それは次のように見えましたあなたが使用したいクラスを持っている... 結局のところ、あなたはkeys = object_namesとvalues = attributes(文字列として)のオブジェクトの辞書を持っています - あなたはどんな型にも変換する必要がありますそれが文字列でない場合)

この入力ファイル形式は、ConfigParserモジュールのようなのように、と表示されます。ファイルを読み込んで"NameOfItem"行を[item]行に変更し、それをConfigParserにStringIOオブジェクトとして渡すことができます。

+0

'if(line.find(" NameOfItem "))'はコロンで終わらず、 'find'が整数を返すので論理はオフです。 'NameOfItem 'が': 'または' if line.startswith(' NameOfItem '): 'のようなものであれば、おそらく'が必要です。 –

+0

これは私が探していたものです。価値のストリッピング、クラスの作成などに十分注意を払う私はすべてを処理して、ちょうどアルゴリズムの脳のおならを持っていた。 私はConfigParserと一緒に遊んでいましたが、私のニーズを満たしていないのは、主に入力データが上で説明した通り正確ではなかったためです(問題を簡略化するために簡略化しました)。 多くの感謝! – mcowger

+0

@StevenRumbalskiええ、私は 'NameOfItem 'を' 'if' 'の行に使っていますが、彼が彼の例でもう一方を使用していたので、私はそれに行きました。 (そして私は不足している ':'を修正しました) – mgilson

2

これはネストされた辞書にデータを配置する点を除いて、mgilsonの答えと似ています。ネストされた辞書としてそれを持っていることについて

from collections import defaultdict 
itemname = None 
d = defaultdict(dict) 
for line in data: 
    line = line.rstrip() 
    if '=' in line: 
     attr, value = line.split('=',1) 
     d[itemname][attr] = value 
    else: 
     itemname = line 
1

何:

x = {'NameOfItemA': {'attribute1': 'value1', 'attribute2': 'value2'},...} 

あなたのように値を参照することができその後:

value2 = x['NameOfItemA']['attribute2'] 

そして、属性を想定し、値は常に、このような見出しをたどりますas NameOfItemN

items = {} 
for line in textinput: 
    if line.find("NameOfItem"): 
     headline = line 
     inner_dict = {} 
     items[headline] = inner_dict 
    else: 
     attr, val = line.split('=',1) 
     items[headline][attr] = val 
1

あなたが興味を持っているであろうpyparsingソリューションがあります。私はコードをかなり歩くためにコメントを追加しました。

data = """\ 
NameOfItemA 
attribute1 = values1A 
attribute2 = values2A 
attributen = valuesnA 
NameOfItemB 
attribute1 = values1B 
attribute2 = values2B 
attributen = valuesnB 
""" 

from pyparsing import Suppress, Word, alphas, alphanums, \ 
       empty, restOfLine, Dict, OneOrMore, Group 

# define some basic elements - suppress the '=' sign because, while 
# it is important during the parsing process, it is not an interesting part 
# of the results 
EQ = Suppress('=') 
ident = Word(alphas, alphanums) 

# an attribute definition is an identifier, and equals, and whatever is left 
# on the line; the empty advances over whitespace so lstrip()'ing the 
# values is not necessary 
attrDef = ident + EQ + empty + restOfLine 

# define a section as a lone ident, followed by one or more attribute 
# definitions (using Dict will allow us to access attributes by name after 
# parsing) 
section = ident + Dict(OneOrMore(Group(attrDef))) 

# overall grammar is defined as a series of sections - again using Dict to 
# give us attribute-name access to each section's attributes 
sections = Dict(OneOrMore(Group(section))) 

# parse the string, which gives back a pyparsing ParseResults 
s = sections.parseString(data) 

# get data using dotted attribute notation 
print s.NameOfItemA.attribute2 

# or access data like it was a nested dict 
print s.keys() 
for k in s.keys(): 
    print s[k].items() 

プリント:

values2A 
['NameOfItemB', 'NameOfItemA'] 
[('attribute2', 'values2B'), ('attribute1', 'values1B'), ('attributen', 'valuesnB')] 
[('attribute2', 'values2A'), ('attribute1', 'values1A'), ('attributen', 'valuesnA')] 
関連する問題