是否有任何插件來同步兩個YAML文件?例如文件1具有同步兩個YAML文件
en:
key1: "Value1"
key2: "Value2"
es:
key1: "EsValue1"
同步,它需要添加KEY2後:在第二個文件「值2」,而不會干擾秩序,並在第二個文件的名稱爲key1。
是否有任何插件來同步兩個YAML文件?例如文件1具有同步兩個YAML文件
en:
key1: "Value1"
key2: "Value2"
es:
key1: "EsValue1"
同步,它需要添加KEY2後:在第二個文件「值2」,而不會干擾秩序,並在第二個文件的名稱爲key1。
你並不真的需要一個插件來做到這一點:
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文件,通過代碼運行結果散列,然後再次寫入文件。
我不確定這是否會保持您的訂單,但如果您使用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
Ruby 1.9不使用排序哈希。它會記住插入順序,因此如果元素沒有按排序順序輸入,它們將不會按排序順序排列。 – 2011-03-30 01:04:38
是的,我的意思是_ordered_哈希。 – szimek 2011-03-30 10:47:34
YAML文件或散列? – 2011-03-30 00:57:21
請注意,YAML映射是無序的,所以保存順序不是YAML操作(這意味着符合的YAML解析器可能會「忘記」順序,並以不同的(可能不可重複的)順序發出它們)。 – 2011-05-23 01:42:04