如何让Ruby从YAML文件中检索特定数据?
首先,我还是一个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 ,
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是的,不确定我在想什么。我更新了我的答案。