簡體   English   中英

解析現有的配置文件

[英]Parsing an existing config file

我有一個以下形式的配置文件:

protocol sample_thread {
    { AUTOSTART 0 }
    { BITMAP thread.gif }
    { COORDS {0 0} }
    { DATAFORMAT {
        { TYPE hl7 }
        { PREPROCS {
            { ARGS {{}} }
            { PROCS sample_proc }
        } }
    } } 
}

真實文件可能沒有這些確切的字段,我寧願在解析之前不必描述數據的結構是解析器。

我已經找了其他配置文件解析器,但我發現沒有人能夠接受這種語法的文件。

我正在尋找一個可以解析這樣的文件的模塊,有什么建議嗎?

如果有人好奇,有問題的文件是由Quovadx Cloverleaf生成的。

對於像這樣的快速簡單的解析, pyparsing非常方便。 最低限度的是:

import pyparsing
string = pyparsing.CharsNotIn("{} \t\r\n")
group = pyparsing.Forward()
group << pyparsing.Group(pyparsing.Literal("{").suppress() + 
                         pyparsing.ZeroOrMore(group) + 
                         pyparsing.Literal("}").suppress()) 
        | string

toplevel = pyparsing.OneOrMore(group)

用它作為:

>>> toplevel.parseString(text)
['protocol', 'sample_thread', [['AUTOSTART', '0'], ['BITMAP', 'thread.gif'], 
['COORDS', ['0', '0']], ['DATAFORMAT', [['TYPE', 'hl7'], ['PREPROCS', 
[['ARGS', [[]]], ['PROCS', 'sample_proc']]]]]]]

從那里你可以根據需要變得更復雜(從字符串中單獨解析數字,查找特定的字段名稱等)。 以上是非常通用的,只是查找字符串(定義為除“{”和“}”之外的任何非空格字符)和{}分隔的字符串列表。

將Brian的pyparsing解決方案再邁出一步,您可以使用Dict類為此格式創建一個准解串器:

import pyparsing

string = pyparsing.CharsNotIn("{} \t\r\n")
# use Word instead of CharsNotIn, to do whitespace skipping
stringchars = pyparsing.printables.replace("{","").replace("}","")
string = pyparsing.Word( stringchars )
# define a simple integer, plus auto-converting parse action
integer = pyparsing.Word("0123456789").setParseAction(lambda t : int(t[0]))
group = pyparsing.Forward()
group << ( pyparsing.Group(pyparsing.Literal("{").suppress() +
    pyparsing.ZeroOrMore(group) +
    pyparsing.Literal("}").suppress())
    | integer | string )

toplevel = pyparsing.OneOrMore(group)

sample = """
protocol sample_thread {
    { AUTOSTART 0 }
    { BITMAP thread.gif }
    { COORDS {0 0} }
    { DATAFORMAT {
        { TYPE hl7 }
        { PREPROCS {
            { ARGS {{}} }
            { PROCS sample_proc }
        } }
    } } 
    }
"""

print toplevel.parseString(sample).asList()

# Now define something a little more meaningful for a protocol structure, 
# and use Dict to auto-assign results names
LBRACE,RBRACE = map(pyparsing.Suppress,"{}")
protocol = ( pyparsing.Keyword("protocol") + 
             string("name") + 
             LBRACE + 
             pyparsing.Dict(pyparsing.OneOrMore(
                pyparsing.Group(LBRACE + string + group + RBRACE)
                ) )("parameters") + 
             RBRACE )

results = protocol.parseString(sample)
print results.name
print results.parameters.BITMAP
print results.parameters.keys()
print results.dump()

打印

['protocol', 'sample_thread', [['AUTOSTART', 0], ['BITMAP', 'thread.gif'], ['COORDS', 

[0, 0]], ['DATAFORMAT', [['TYPE', 'hl7'], ['PREPROCS', [['ARGS', [[]]], ['PROCS', 'sample_proc']]]]]]]
sample_thread
thread.gif
['DATAFORMAT', 'COORDS', 'AUTOSTART', 'BITMAP']
['protocol', 'sample_thread', [['AUTOSTART', 0], ['BITMAP', 'thread.gif'], ['COORDS', [0, 0]], ['DATAFORMAT', [['TYPE', 'hl7'], ['PREPROCS', [['ARGS', [[]]], ['PROCS', 'sample_proc']]]]]]]
- name: sample_thread
- parameters: [['AUTOSTART', 0], ['BITMAP', 'thread.gif'], ['COORDS', [0, 0]], ['DATAFORMAT', [['TYPE', 'hl7'], ['PREPROCS', [['ARGS', [[]]], ['PROCS', 'sample_proc']]]]]]
  - AUTOSTART: 0
  - BITMAP: thread.gif
  - COORDS: [0, 0]
  - DATAFORMAT: [['TYPE', 'hl7'], ['PREPROCS', [['ARGS', [[]]], ['PROCS', 'sample_proc']]]]

我認為通過pyparsing你會更快。

- 保羅

我會嘗試回答我認為缺失的問題......

配置文件有多種格式。 有眾所周知的格式,如* .ini或apache配置 - 這些格式往往有許多解析器可用。

然后有自定義格式。 這就是你的看法(它可能是你和我以前從未見過的一些定義明確的格式 - 但直到你知道它是什么並不重要)。

我將從它來自的軟件開始,看看他們是否有可以加載/生成這些文件的編程API。 如果沒有什么是顯而易見的,請給Quovadx打電話。 有可能有人已經解決了這個問題。

否則你可能會自己創建自己的解析器。

假設您的樣本代表完整示例,為此格式編寫解析器並不是非常困難。 它是值的層次結構,其中每個節點可以包含值的值或子層次結構。 一旦定義了值可以包含的基本類型,解析器就是一個非常簡單的結構。

你可以使用像Lex / Flex這樣的東西或者用你選擇的語言中的直接解析器來快速寫出來。

您可以輕松地在python中編寫腳本,將其轉換為python dict,格式看起來幾乎像分層名稱值對,只有問題似乎是Coards {0 0},其中{0 0}不是名稱值對,但是一個列表,所以誰知道其他這樣的情況是什么格式我認為你最好的選擇是有該格式的規范,並編寫一個簡單的python腳本來閱讀它。

您的配置文件與JSON非常相似(幾乎用“[”和“]”替換所有“{”和“}”)。 大多數語言都有內置的JSON解析器(PHP,Ruby,Python等),如果沒有,可以使用庫來處理它。

如果您無法更改配置文件的格式,則可以將所有文件內容作為字符串讀取,並通過您喜歡的任何方式替換所有“{”和“}”字符。 然后你可以將字符串解析為JSON,然后就可以了。

我在奶酪店搜索了一下,但我找不到任何有用的例子。 查看Examples頁面,以及這個特定的解析器(它的語法類似於你的一些)。 我認為這應該可以幫助你自己寫。

看看LEX和YACC 一點學習曲線,但他們可以為任何語言生成解析器。

也許您可以編寫一個簡單的腳本,將您的配置轉換為xml文件,然后使用lxml,Beatuful Soup或其他任何東西讀取它? 例如,您的轉換器可以使用PyParsing或正則表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM