2011-08-22 1 views
3

나는이 YAML 있습니다YAML/Ruby : <field>이 <value> 인 첫 번째 항목 가져 오기?

- company: 
    - id: toyota 
    - fullname: トヨタ自動車株式会社 
- company: 
    - id: konami 
    - fullname: Konami Corporation 

을 그리고 id가 konami있는 회사의 전체 이름을 싶어.

루비 1.9.2를 사용하면 가장 간단하고 일반적인 방법은 무엇입니까?

참고 : 내 코드의 나머지 부분에서는 require "yaml"을 사용하고 있으므로 동일한 라이브러리를 사용하는 것이 좋습니다.

+0

당신은 당신이 지금까지 무엇을 보여줄 수 있습니까? – jtbandes

+0

yaml을 변경하면 원하는 것을 훨씬 쉽게 수행 할 수 있음을 보여주는 내 대답이 업데이트되었습니다. – Mischa

+0

@ 미샤 : 대단한! 저건 완벽 해. 나는 YAML에 대해 더 많은 것을 배우기 위해 시간을 정말로 가져야한다. –

답변

3

이 너무 작동하고 반복 사용하지 않습니다

y = YAML.load_file('japanese_companies.yml') 
result = y.select{ |x| x['company'].first['id'] == 'konami' } 
result.first['company'].last['fullname'] # => "Konami Corporation" 

을 또는 다른 속성과 당신이있는 경우 fullname이 마지막입니다 확신 할 수 없다 :

result.first['company'].select{ |x| x['fullname'] }.first['fullname'] 

나는 당신이 당신의 YML을 변경하면 훨씬 쉽게되고, 레이 톨에 동의합니다. 예컨대 : 코나미의 전체 이름을 가져 오는

위 YAML와
toyota: 
    fullname: トヨタ自動車株式会社 
konami: 
    fullname: Konami Corporation 

훨씬 쉬워집니다 :

y = YAML.load_file('test.yml') 
y.fetch('konami')['fullname'] 
1

YAML은 약간 비 전형적이지만 보상 할 수 있습니다. (이것은 YAML 구문 분석없이 할 수 있는지 확실하지 않습니다)

무력 접근 방식은 다음과 같습니다

require 'yaml' 

YAML.parse_file(ARGV[0]).transform.each do |company| 
    properties = {} 
    company['company'].each {|h| properties = properties.merge(h)} 
    puts properties['fullname'] if properties['id'] == 'konami' 
end 

이 스크립트에 첫 번째 인수로에 YAML 파일을 전달합니다.

문자열로 YAML을 사용하는 메서드에 자유롭게 적응하고 은 원하는 전체 이름을 반환합니다. (이 직접 첫번째 같은 회사를 얻는 영업 이익의 질문에 대한 대답 있기 때문에 반환에 유용합니다.)

+0

더 나은 YAML 형식에 대한 제안에 대해 매우 열정적입니다 :-) 참고 : 회사에는 실제로 다른 필드와 문자열 배열이 포함되어 있습니다. –

+2

비정상적으로 저는 회사의 각 속성 앞에 하이픈을 사용하지 않으려한다는 것을 의미합니다 (예 : id , fullname 등). 그 (것)들을 가지고 배열에있는 별개의 객체로 만듭니다. "내부"하이픈이 없으면 문제가 훨씬 간단 해집니다. –

+0

위대한 트릭! 나는 YAML을 더 간단하게 만들었지 만 사람들이 이미 답변을 게시했기 때문에 나는 그대로 질문을 유지할 것이다. –

관련 문제