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

如何让Ruby从YAML文件中检索特定数据?,ruby,yaml,Ruby,Yaml,首先,我还是一个Ruby新手,所以这可能是一个很小的问题,但不管怎样,我仍然在努力。 因此,我有一个YAML文件设置如下: userA: { nick: cat , fruit: apple , canDance: true , age: 20 } userB: { nick: dog , fruit: orange , canDance: false ,

首先,我还是一个Ruby新手,所以这可能是一个很小的问题,但不管怎样,我仍然在努力。 因此,我有一个YAML文件设置如下:

userA:
    {
        nick: cat ,
        fruit: apple ,
        canDance: true ,
        age: 20
    }

userB:
    {
        nick: dog ,
        fruit: orange ,
        canDance: false ,
        age: 23
    }

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

您可以从YAML中读取所需信息,如下所示:

require 'yaml'

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

puts people['userA']['fruit']    #=> 'apple'
puts people['userB']['canDance'] #=> true
userA:
  nick: cat
  fruit: apple
  canDance: true
  age: 20

userB:
  nick: dog
  fruit: orange
  canDance: false
  age: 23
people['userA']['hobbies']
注意:您的YAML文件似乎是有效的,可以由默认的Ruby YAML解析器读取。但它使用了一种非常特殊且不常见的语法。我建议您这样写YAML:

require 'yaml'

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

puts people['userA']['fruit']    #=> 'apple'
puts people['userB']['canDance'] #=> true
userA:
  nick: cat
  fruit: apple
  canDance: true
  age: 20

userB:
  nick: dog
  fruit: orange
  canDance: false
  age: 23
people['userA']['hobbies']

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

下面是一个示例,其中为
嗜好添加了一些混合类型

test.yml 使用Ruby,你可以简单地要求它

require 'yaml'

people = File.load_file 'test.yml'
people
现在是一个实例,它允许您通过在方括号内调用键来获取键的值,如下所示:

people['userA']
现在,您可以通过如下方式链接关键点来挖掘对象:

require 'yaml'

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

puts people['userA']['fruit']    #=> 'apple'
puts people['userB']['canDance'] #=> true
userA:
  nick: cat
  fruit: apple
  canDance: true
  age: 20

userB:
  nick: dog
  fruit: orange
  canDance: false
  age: 23
people['userA']['hobbies']
但是请注意,如果链“断开”,则会出现错误

引发异常的原因是
people['userA']['sports']
返回nil,因此尝试连锁
['netsing']
会抛出错误。在深入挖掘嵌套的哈希时,避免这种情况的一种有用方法是使用
.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')

非常感谢你,朋友!我很感激!“首先,你的示例不是一个有效的YAML文件。”–你为什么这么说?您能指出YAML 1.2规范中违反的具体条款吗?我有点困惑,因为我用几个解析器测试了OP的YAML,所有的解析器都能解析它,我也用几个验证器测试了它,大约50%的人验证了它,而50%的人没有。但是,我很难看到确切的违规行为。特别是,@JörgWMittag。你说得很对。我刚刚研究了YAML 1.2规范,并惊讶地发现它实际上可以使用大括号和逗号来描述哈希。我以前从未见过这种情况,而且这种语法似乎非常罕见。但是你是对的,虽然它使用了一种非常特殊的语法,但语法看起来还不错。也许有些验证器只实现通用语法?现在我也很困惑。“您的示例数据不是有效的YAML”-您能指出YAML 1.2规范中违反的特定条款吗?我有点困惑,因为我用几个解析器测试了OP的YAML,所有的解析器都能解析它,我也用几个验证器测试了它,大约50%的人验证了它,而50%的人没有。但是,我很难看到确切的违规行为。特别是,“你可以通过在这根短绒中测试它来看到”——如果我用这根短绒测试OP的YAML,我会得到结果:“有效的YAML!”我做错了什么?@JörgWMittag是的,不确定我在想什么。我更新了我的答案。