2011-03-29 6 views
1

두 YAML 파일을 동기화 할 플러그인이 있습니까? 순서와 두 번째 파일에서 키 1을 방해하지 않고 두 번째 파일에서 "값 2"예 file1을 들어이 키 2를 추가 할 필요가 동기화 후두 개의 YAML 파일을 동기화하십시오.

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

있습니다.

+0

YAML 파일 또는 해시? –

+0

YAML 맵은 순서가 지정되지 않으므로 순서를 유지하는 것은 YAML 연산이 아니므로 일치하는 YAML 파서가 순서를 "잊어 버려"다른 순서로 (가능한 경우 반복 불가능한 순서로) 내보낼 수 있음을 의미합니다. –

답변

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.load_file를 사용하여 해시에 YAML 파일의 내용을 읽고 다음과 같이 뭔가를 할 수 :

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

을 한 후 다시 YAML 파일에 ES 해시를 덤프.

재귀 병합이 솔루션은 여기에 제안했다 : http://www.ruby-forum.com/topic/142809#635081

+0

Ruby 1.9는 정렬 된 해시를 사용하지 않습니다. 그것은 삽입 순서를 기억하므로 요소가 정렬 된 순서로 입력되지 않으면 정렬 된 순서로 나오지 않습니다. –

+0

네, 해쉬를 의미했습니다. – szimek

관련 문제