두 YAML 파일을 동기화 할 플러그인이 있습니까? 순서와 두 번째 파일에서 키 1을 방해하지 않고 두 번째 파일에서 "값 2"예 file1을 들어이 키 2를 추가 할 필요가 동기화 후두 개의 YAML 파일을 동기화하십시오.
en:
key1: "Value1"
key2: "Value2"
es:
key1: "EsValue1"
있습니다.
두 YAML 파일을 동기화 할 플러그인이 있습니까? 순서와 두 번째 파일에서 키 1을 방해하지 않고 두 번째 파일에서 "값 2"예 file1을 들어이 키 2를 추가 할 필요가 동기화 후두 개의 YAML 파일을 동기화하십시오.
en:
key1: "Value1"
key2: "Value2"
es:
key1: "EsValue1"
있습니다.
당신은 정말 그것을 할 수있는 플러그인이 필요하지 않습니다
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.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
Ruby 1.9는 정렬 된 해시를 사용하지 않습니다. 그것은 삽입 순서를 기억하므로 요소가 정렬 된 순서로 입력되지 않으면 정렬 된 순서로 나오지 않습니다. –
네, 해쉬를 의미했습니다. – szimek
YAML 파일 또는 해시? –
YAML 맵은 순서가 지정되지 않으므로 순서를 유지하는 것은 YAML 연산이 아니므로 일치하는 YAML 파서가 순서를 "잊어 버려"다른 순서로 (가능한 경우 반복 불가능한 순서로) 내보낼 수 있음을 의미합니다. –