如何比较yaml文件中的键?

时间:2011-06-08 04:11:11

标签: ruby-on-rails internationalization compare yaml

rails国际化yaml文件中有两个ruby。一个文件已完成,另一个文件缺少密钥。如何比较两个yaml文件并查看第二个文件中缺少的键?有没有工具可以做到这一点?

4 个答案:

答案 0 :(得分:13)

假设file1是正确的版本而file2是缺少密钥的版本:

def compare_yaml_hash(cf1, cf2, context = [])
  cf1.each do |key, value|

    unless cf2.key?(key)
      puts "Missing key : #{key} in path #{context.join(".")}" 
      next
    end

    value2 = cf2[key]
    if (value.class != value2.class)
      puts "Key value type mismatch : #{key} in path #{context.join(".")}" 
      next
    end

    if value.is_a?(Hash)
      compare_yaml_hash(value, value2, (context + [key]))  
      next
    end

    if (value != value2)
      puts "Key value mismatch : #{key} in path #{context.join(".")}" 
    end    
  end
end

现在

compare_yaml_hash(YAML.load_file("file1"), YAML.load_file("file2"))

限制:如果YAML文件包含数组,则应扩展当前实现以支持数组。

答案 1 :(得分:2)

我找不到一个快速的工具来做到这一点。我决定写我的own tool for this.

您可以使用cabal进行安装:

$ cabal update
$ cabal install yamlkeysdiff

然后你可以这样区分两个文件:

$ yamlkeysdiff file1.yml file2.yml
> missing key in file2
< missing key in file1

您还可以比较文件的两个子集:

$ yamlkeysdiff "file1.yml#key:subkey" "file2.yml#otherkey"

它的行为与diff完全相同,您可以这样做:

$ yamlkeysdiff file1.yml file2.yml && echo Is the same || echo Is different

答案 2 :(得分:0)

我想提取diff来处理一些东西,这里的代码片段只是打印东西。所以我的版本返回带有diff的哈希。它的结构反映了原始哈希,但是值是对差异的描述。

def deep_hash_diff(hash1, hash2, hash1_name = 'Hash 1', hash2_name = 'Hash 2')
  diff = {}
  (hash1.keys - hash2.keys).each do |key1|
    diff[key1] = "Present in #{hash1_name}, but not in #{hash2_name}"
  end
  (hash2.keys - hash1.keys).each do |key2|
    diff[key2] = "Present in #{hash2_name}, but not in #{hash1_name}"
  end

  (hash1.keys & hash2.keys).each do |common_key|
    if hash1[common_key].is_a?(Hash)
      if hash2[common_key].is_a?(Hash)
        res = deep_hash_diff(hash1[common_key], hash2[common_key], hash1_name, hash2_name)
        diff[common_key] = res if res.present?
      else
        diff[common_key] = "#{hash1_name} has nested hash, but #{hash2_name} just value #{hash2[common_key]}"
      end
    elsif hash2[common_key].is_a?(Hash)
      diff[common_key] = "#{hash2_name} has nested hash, but #{hash1_name} just value #{hash1[common_key]}"
    end
  end
  diff
end

然后,我将其用作:

res = deep_hash_diff(YAML.load_file("en.yml"), YAML.load_file("spa.yml"), 'English translation', 'Spanish translation')
puts(res.to_yaml) # for nicer output

答案 3 :(得分:0)

differz 比较两个YAML文件,并在第二个文件中打印丢失的密钥。

它既作为库又作为命令行工具来提供。您可以使用within(str, serial.number <- ave(structure,cluster,FUN = seq_along)) 安装后者。