开发者

YAML/Ruby: Get the first item whose <field> is <value>?

开发者 https://www.devze.com 2023-03-29 22:38 出处:网络
I have this YAML: - company: - id: toyota - fullname: トヨタ自動車株式会社 - company: - id: ko开发者_StackOverflow社区nami

I have this YAML:

- company: 
  - id: toyota
  - fullname: トヨタ自動車株式会社
- company:
  - id: ko开发者_StackOverflow社区nami
  - fullname: Konami Corporation

And I want to get the fullname of the company whose id is konami.

Using Ruby 1.9.2, what is the simplest/usual way to get it?

Note: In the rest of my code, I have been using require "yaml" so I would prefer to use the same library.


This works too and does not use iteration:

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

Or if you have other attributes and you can't be sure fullname is the last one:

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

I agree with Ray Toal, if you change your yml it becomes much easier. E.g.:

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

With the above yaml, fetching the fullname of konami becomes much easier:

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


Your YAML is a little unconventional but we can compensate.

A brute force approach is (I'm not sure if this can be done without parsing the 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

Pass your YAML file in as the first argument to this script.

Feel free to adapt into a method that takes the YAML as a string and returns the desired fullname. (A return is useful because it directly answers the OP's question of obtaining the first such company.)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号