2012-06-08 67 views
2

比方說,你有一個YML文件是這樣的:如何合併和排序Ruby中的YML文件中的鍵?

en: 
    thanksgiving: 
    turkey: 'Turkey' 
    stuffing: 'Stuffing' 
    christmas: 
    ham: 'Bring ham' 
    thanksgiving: 
    beer: 'lots of beer' 

,你想用Ruby基本上都看過,鞏固和重寫陽明這樣的:

en: 
    thanksgiving: 
    turkey: 'Turkey' 
    stuffing: 'Stuffing' 
    beer: 'lots of beer' 
    christmas: 
    ham: 'Bring ham' 

什麼是最最好的/最有效的方式來做到這一點?

+0

完成。對於那個很抱歉。 – JoshL

回答

1

你需要分析該文件以獲取節點表示:

yml = YAML.parse(open('c:\temp\foo.yml')) 

yml變量包含整個結構。例如:鍵入以下打印的實際整個文件內容

pp yml 

檢查結果,我能夠寫一個安全的串行之後。在鐵軌控制檯添加了一個名爲config/initializers/yaml.rb

module YAML 

    def YAML.safe_load(file_name) 
    YAML::safe_load_node(YAML::parse(IO.read(file_name))) 
    end 

    def YAML.safe_load_node(input) 
    case input.kind 
    when :map 
     {}.tap do |h| 
     input.value.each do |key, node| 
      k,v = key.value, YAML::safe_load_node(node) 
      if (v.is_a?(Hash) and h[k].is_a?(Hash)) 
      h[k] = h[k].merge(v) 
      elsif (v.is_a?(Array) and h[k].is_a?(Array)) 
      h[k] = h[k] + v 
      else 
      h[k] = v 
      end 
     end 
     end 
    when :seq 
     input.value.map{|node| YAML::safe_load_node(node)} 
    when :scalar 
     input.value 
    end 
    end 

end 

文件現在:

>> y YAML::safe_load('c:/temp/test.yml') 
--- 
en: 
    christmas: 
    ham: Bring ham 
    thanksgiving: 
    turkey: Turkey 
    stuffing: Stuffing 
    beer: lots of beer 
+0

我已更新答案以添加可能的解決方案。看一看。 –

+0

這非常整齊。我想出了一種通過深度散列合併來實現它的方式,但是你的方式很有趣。謝謝 – JoshL