Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby将一行注入YAML文件_Ruby_Yaml - Fatal编程技术网

如何使用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。如果他再举个例子就好了