如何让Ruby从YAML文件中检索特定数据?

时间:2019-09-07 07:57:31

标签: ruby yaml

首先,我仍然是Ruby新手,所以这可能是一个琐碎的问题,但是无论如何,我仍在努力。 因此,我设置了一个YAML文件,如下所示:

Base

假设YAML文件已加载到Ruby中,我将如何检索该文件的特定部分,例如检索userA的水果或userB的canDance?预先感谢。

2 个答案:

答案 0 :(得分:3)

您可以像这样从YAML中读取所需的信息:

require 'yaml'

people = YAML.load_file('the_filename.yaml')

puts people['userA']['fruit']    #=> 'apple'
puts people['userB']['canDance'] #=> true

注意:您的YAML文件似乎有效,并且可以由默认的Ruby YAML解析器读取。但是它使用了非常特殊且不常见的语法。我建议这样写您的YAML:

userA:
  nick: cat
  fruit: apple
  canDance: true
  age: 20

userB:
  nick: dog
  fruit: orange
  canDance: false
  age: 23

答案 1 :(得分:0)

已更新:您的示例数据可以通过Ruby的标准lib YAML进行解析,但是不需要花括号和逗号。

以下是为hobbies添加了一些混合类型的示例

test.yml

---
userA:
  nick: cat
  fruit: apple
  canDance: true
  age: 20
  hobbies:
    - coding
    - tennis
  music:
    production: true
    djing: true
    guitar: true

userB:
  nick: dog
  fruit: orange
  canDance: false
  age: 23
  hobbies:
    - coding
    - ruby
  sports:
    tennis: always
    soccer: sometimes
    running: rarely

使用您只需要求的Ruby Yaml core lib

require 'yaml'

people = File.load_file 'test.yml'

people现在是Hash class的实例,它使您可以通过在方括号内调用键来获取键的值,如下所示:

people['userA']

现在,您可以通过链接如下键来浏览对象:

people['userA']['hobbies']

但是请注意,如果链条“断裂”,您将得到一个错误消息

people['userB']['sports']['tennis'] # this works
=>"always"

people['userA']['sports']['tennis'] # this will raise
=>NoMethodError: undefined method `[]' for nil:NilClass

引发异常是因为people['userA']['sports']返回nil,因此尝试链接['tennis']会引发错误。挖掘深度嵌套的哈希时,避免这种情况的一种有用方法是使用.dig

people.dig('userB','sports','tennis')
=>"always"
people.dig('userA','sports','tennis')
=>nil # 
people.dig('userA','music','djing')
=>true
people.dig('userB','music','djing')
=>nil

使用散列符谁是字符串,您还可以对字符串进行插值。假设我们要随机选择一个用户并进行挖掘,我们可能会做类似的事情:

people.dig("user#{ ['A','B'].sample }",'music','djing')