2011-03-29 74 views
1

是否有任何插件来同步两个YAML文件?例如文件1具有同步两个YAML文件

en: 
    key1: "Value1" 
    key2: "Value2" 
es: 
    key1: "EsValue1" 

同步,它需要添加KEY2后:在第二个文件“值2”,而不会干扰秩序,并在第二个文件的名称为key1。

+0

YAML文件或散列? – 2011-03-30 00:57:21

+0

请注意,YAML映射是无序的,所以保存顺序不是YAML操作(这意味着符合的YAML解析器可能会“忘记”顺序,并以不同的(可能不可重复的)顺序发出它们)。 – 2011-05-23 01:42:04

回答

1

你并不真的需要一个插件来做到这一点:

str = <<EOT 
en: 
    key1: "Value1" 
    key2: "Value2" 
es: 
    key1: "EsValue1" 
EOT 

require 'yaml' 
yaml = YAML::load(str) 

(hash['en'].keys - hash['es'].keys).each{ |k| hash['es'][k] = hash['en'][k] } 

>> ap hash #=> nil 
{ 
    "en" => { 
     "key1" => "Value1", 
     "key2" => "Value2" 
    }, 
    "es" => { 
     "key1" => "EsValue1", 
     "key2" => "Value2" 
    } 
} 

如果您有其他散列工艺任意数量:

(yaml.keys - ['en']).each do |h| 
    (yaml['en'].keys - yaml[h].keys).each do |k| 
    yaml[h][k] = yaml['en'][k] 
    end 
end 

因此,读取YAML文件,通过代码运行结果散列,然后再次写入文件。

2

我不确定这是否会保持您的订单,但如果您使用Ruby 1.9,它很可能是因为它使用分类散列。你可以读取YAML文件的内容为使用YAML.load_file哈希值,然后做这样的事情:

merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 } 
es.merge(en, &merger) 

,然后再次转储ES哈希到YAML文件。

该解决方案递归合并建议位置:http://www.ruby-forum.com/topic/142809#635081

+0

Ruby 1.9不使用排序哈希。它会记住插入顺序,因此如果元素没有按排序顺序输入,它们将不会按排序顺序排列。 – 2011-03-30 01:04:38

+0

是的,我的意思是_ordered_哈希。 – szimek 2011-03-30 10:47:34