如何从YAML文件中读取多个文档?

时间:2016-03-07 04:46:11

标签: ruby file-io yaml

我想创建一个仅包含哈希值的YAML文件。但是,我不能迭代它。当我尝试使用:

加载YAML文件时
YAML.load_file('yamlFile.yml') 

它只返回文件中的第一个哈希值。这是我想要创建的示例文件:

---
:reach_hypo: true
:liquid: true
---
:reach_hypo: true
:liquid: false
---
:reach_hypo: true
:liquid: true 

如果我加载上述文件,我会得到:

{reach_hypo: true, liquid: true}

我找到的唯一解决方法是将所有哈希值添加到数组中,然后将其写入YAML文件。是否有更好的方法,例如YAML方法,迭代YAML文件?

3 个答案:

答案 0 :(得分:8)

从单个文件中读取多个YAML文档作为流

您可以使用YAML::load_stream从单个文件中读取多个文档。例如:

require 'yaml'

array = []
YAML.load_stream(File.read 'test.yml') { |doc| array << doc }
array

#=> [{:reach_hypo=>true, :liquid=>true}, {:reach_hypo=>true, :liquid=>false}, {:reach_hypo=>true, :liquid=>true}]

答案 1 :(得分:0)

我想你知道这一点,只是想要一个不同的解决方案,但是为了记录,我相信你有两个选择。

  1. 制作一系列哈希值。
  2.     - a: b
          c: d
        - e: f
          g: h
    
    1. 使用两级哈希,即命名每个二级哈希并迭代顶层的键。
    2.     x:
            a: b
            c: d
          y:
            e: f
            g: h

答案 2 :(得分:0)

你可以尝试使用Psych。它自1.9.3以来一直存在,但我直到今天才注意到它。使用libyaml进行解析。 ruby-doc

我尝试了以下代码并按预期工作:

require 'psych'

hash_arr = Psych.load_stream(File.read('yamlFile.yml'))
#=> [{:reach_hypo=>true, :liquid=>true}, {:reach_hypo=>true, :liquid=>false}, {:reach_hypo=>true, :liquid=>true}]