如何使用Ruby将一行注入YAML文件
我正在使用如何使用Ruby将一行注入YAML文件,ruby,yaml,Ruby,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/bla
编写一个数组到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指令行下添加另一行。我需要在三个破折号(--
)下面添加单词类:
如果要在文件末尾添加内容,只需在以下内容之间写入:
f.puts item.to_yaml
及
但是,您应该考虑编写<代码>键(因为它是唯一的)您编写的YAML文件的文件名的一部分。正如您的
/tmp/blah一样。yaml
是为第一个键编写的,在每个循环中处理的每个下一个键都会被覆盖,这可能不是您想要的。如果您想在文件末尾添加内容,那么只需在以下两个键之间写入:
f.puts item.to_yaml
及
但是,您应该考虑编写<代码>键(因为它是唯一的)您编写的YAML文件的文件名的一部分。正如您的
/tmp/blah一样。yaml
是为第一个键编写的,在每个循环中处理的每个下一个键都会被覆盖,这可能不是您想要的。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:
之前,这将是编写代码或在-4
之后附加到文件中时的一个难题
相反,我们可以加载并解析该文件,根据需要使用munge生成的对象,然后重写YAML文件,因为我们知道语法是正确的
在下面的代码中,假设bar
是使用YAML的load_file
读取和解析YAML文件的结果,而不是我使用的load
仅解析序列化对象:
require 'yaml'
bar = YAML.load("---\na: [1]\n") # => {"a"=>[1]}
bar # => {"a"=>[1], "b"=>{"c"=>[2, 3, 4]}}
我可以修改栏
:
bar['b'] = {'c' => [2,3,4]}
以下是修改后的对象:
require 'yaml'
bar = YAML.load("---\na: [1]\n") # => {"a"=>[1]}
bar # => {"a"=>[1], "b"=>{"c"=>[2, 3, 4]}}
使用序列化到_yaml
将写入正确的yaml:
bar.to_yaml # => "---\na:\n- 1\nb:\n c:\n - 2\n - 3\n - 4\n"
如果是:
File.write('foo.yaml', bar.to_yaml)
你会毫不费力地完成改变
与其简单地覆盖文件,我建议遵循安全的文件覆盖实践,写入新文件,重命名旧文件,将新文件重命名为旧文件的名称,然后删除重命名的旧文件。这有助于确保如果代码或计算机死亡导致您丢失所有数据,文件不会被删除 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:
之前,这将是编写代码或在-4
之后附加到文件中时的一个难题
相反,我们可以加载并解析该文件,根据需要使用munge生成的对象,然后重写YAML文件,因为我们知道语法是正确的
在下面的代码中,假设bar
是使用YAML的load_file
读取和解析YAML文件的结果,而不是我使用的load
仅解析序列化对象:
require 'yaml'
bar = YAML.load("---\na: [1]\n") # => {"a"=>[1]}
bar # => {"a"=>[1], "b"=>{"c"=>[2, 3, 4]}}
我可以修改栏
:
bar['b'] = {'c' => [2,3,4]}
以下是修改后的对象:
require 'yaml'
bar = YAML.load("---\na: [1]\n") # => {"a"=>[1]}
bar # => {"a"=>[1], "b"=>{"c"=>[2, 3, 4]}}
使用序列化到_yaml
将写入正确的yaml:
bar.to_yaml # => "---\na:\n- 1\nb:\n c:\n - 2\n - 3\n - 4\n"
如果是:
File.write('foo.yaml', bar.to_yaml)
你会毫不费力地完成改变
与其简单地覆盖文件,我建议遵循安全的文件覆盖实践,写入新文件,重命名旧文件,将新文件重命名为旧文件的名称,然后删除重命名的旧文件。这有助于确保如果代码或计算机死亡导致您丢失所有数据,文件不会被删除 我不知道你到底想做什么,但是#to_yaml
返回一个字符串,因此你应该能够在事后使用任何字符串方法。更新了我的帖子,希望能消除任何混淆。感谢您的回复!看起来您正在一次性读取YAML文件,但请尝试逐行写入另一个YAML文件。一行一行地手动编写YAML非常容易出错(我看不出这样做的正当理由)。相反,在内存中构建数据结构并一次性编写YAML文件。@spickermann,我建议您用这个来创建一个答案,因为OP了解该做什么很重要。还有,谈谈这个问题。@theTinMan:我同意,我也愿意。但老实说,我不明白他的问题和他的例子是如何结合在一起的,以及他真正想要实现什么。我觉得他好像在试图手动生成无效的YAML。如果他再举个例子就好了