如何使用Ruby

时间:2016-11-17 17:53:45

标签: ruby yaml

我使用to_yaml将数组写入Ruby中的YAML文件。写完文件后,我需要在YAML指令行(---)或三个破折号下添加另一行或单词。

写完YAML文件后有没有办法做到这一点?或者通常只有更好的方法来做这件事吗?

我正在从一个YAML文件中读取以写入另一个:

items = YAML::load(File.open(yaml_file)

items.each do |key, value|
  item = items["#{key}"]
  f = File.open("/tmp/blah.yaml", 'w')
  f.puts item.to_yaml
  f.close
end

在正确写入YAML文件后,我意识到我需要在YAML指令行下添加另一行。我需要在三个破折号(---)下面添加单词类:

---
- blah::words
- blah::words

2 个答案:

答案 0 :(得分:0)

如果你想在文件的末尾添加一些内容,那么只需在:

之间写下来
f.puts item.to_yaml

f.close

但是,您应该考虑将key(因为它是唯一的)部分写入您编写的YAML文件的文件名。就像你的/tmp/blah.yaml是针对第一个密钥编写的那样,并且覆盖了each循环中处理的每个下一个密钥,这可能不是你想要的。

答案 1 :(得分:0)

YAML是对象的序列化版本,可以是散列,也可以是数组。由于序列化程序的工作方式,根据规范,我们不能在任何旧位置输出一行,它必须在语法上正确。并且,最简单的方法是让YAML解析器和序列化器为您处理它。

例如:

require 'yaml'

foo = {'a' => 1}
puts foo.to_yaml

哪个输出:

---
a: 1

并且是YAML格式的简单哈希。

我们可以进行往返表明这是正确的:

bar = foo.to_yaml
YAML.load(bar) # => {"a"=>1}

更复杂的对象显示了它如何变得棘手:

foo = {'a' => [1,2], 'b' => {'c' => [3, 4]}}
puts foo.to_yaml

导致:

---
a:
- 1
- 2
b:
  c:
  - 3
  - 4

还有其他方法可以指定数组,但这是序列化程序的默认设置。如果您添加了一行,则根据您要添加的内容,它必须在a:b:之前,这在编写代码或在{{1}之后附加到文件时会很麻烦}。

相反,我们可以加载和解析文件,然后根据需要调整生成的对象,然后重写YAML文件,知道语法是正确的。

在下面的代码中,假设- 4是使用YAML的bar的结果,它读取并解析YAML文件,而不是使用仅解析序列化的load_file对象:

load

我可以修改require 'yaml' bar = YAML.load("---\na: [1]\n") # => {"a"=>[1]}

bar

这是修改后的对象:

bar['b'] = {'c' => [2,3,4]}

并使用bar # => {"a"=>[1], "b"=>{"c"=>[2, 3, 4]}} 进行序列化将编写正确的YAML:

to_yaml

如果是:

bar.to_yaml # => "---\na:\n- 1\nb:\n  c:\n  - 2\n  - 3\n  - 4\n"

你已经完成了改变而没有任何麻烦。

我建议不要简单地覆盖文件,而是建议通过写入新文件,重命名旧文件,将新文件重命名为旧名称,然后删除重命名的旧文件,遵循安全文件覆盖做法。这有助于确保在代码或计算机死机导致您丢失所有数据时文件不会被破坏。