2016-03-01 89 views
1

使用meld/xxdiff /或其他東西?如何「合併」兩個YAML文本文件?

說如果我有兩個yaml文件,我怎麼能自動合併它們?他們每個人都有幾百行。公共部分爲abc:

abc: 
    x: 
    0: null 
    y: 
    1: null 

def: 
    x: 
    0: string 

... 

abc: 
    u: null 
    v: null 
    w: null 

def: 
    u: 
    0: null 
    v: null 
    w: null 
... 

期望的結果:

abc: 
    x: 
    0: null 
    y: 
    1: null 
    u: null 
    v: null 
    w: null 

def: 
    x: 
    0: string 
    u: 
    0: null 
    v: null 
    w: null   

可以在此與任何差異來完成/合併工具?

編輯:在理想的結果固定錯字

+0

是不是'def'一個共同的部分呢?你真的想合併嗎? 'abc',但是'def'有不同的條目? – morxa

+0

由於你的輸出是[不再有效的YAML](http://www.yaml.org/spec/1.2/spec.html#id2764652),你能告訴我們你要做什麼嗎?在什麼基礎上'abc'鍵值被合併,'def'鍵的值不是?第一個位置?實際的名字?如果'abc'在第二個文件中的'def'之後會發生什麼?你的輸入文件是否真的是YAML這樣簡單的子集,例如映射條目之間沒有註釋,沒有錨? – Anthon

+0

啊對不起,只是錯字。我會編輯我的問題。我想最終結果是有效的yaml,但有兩個文件合併。 @安永是我的輸入文件和上面一樣簡單,沒有評論。 – Shuman

回答

0

我不認爲你可以做你想做什麼,而不解析文件。但是你可以用很短的Python程序這樣做:

import sys 

import ruamel.yaml 

data = None 

for file_name in sys.argv[1:]: 
    d = ruamel.yaml.round_trip_load(open(file_name, 'rb')) 
    if data is None: 
     data = d 
     continue 
    for k in d: 
     data[k].update(d[k]) 

print(ruamel.yaml.round_trip_dump(data, indent=2, explicit_end=True)) 

這給(假設相應的輸入文件:

abc: 
    x: 
    0: 
    y: 
    1:  

    u: 
    v: 
    w: 
def: 
    x: 
    0: string 
    u: 
    0: 
    v: 
    w: 
... 

請注意額外的空格會丟失爲ruamel.yaml(披露:我是如果需要超過頂級密鑰合併,您還需要使.update()更智能化,也就是遞歸式,

+0

目前沒有簡單的方法將python None值顯式轉儲回顯式空值。可以使用一些額外的代碼來完成 – Anthon