我正在从ruby向yaml文件写入数据,我经常在文件中点缀别名。比如:
- &id001
somekey: somevalue
- *id001
在我的情况下,我使用yaml文件来辅助可读性并将名称添加到文件中的值,因为现有数据只是|
分隔的值,没有键。如何防止使用别名写入yaml文件?
[编辑]
为了进一步说明,这里是一个数据类型和问题的例子。
原始数据如下:
Ham|2.00|1
Eggs|0.50|12
Milk|2.00|2
我已经编写了一个ruby脚本来将其转换为yaml,它也会查看sql文件以获取相应的名称。 yaml文件如下所示:
---
- !omap
- name: Ham
- &id001
price: 2.00
- quantity: 1
- !omap
- name: Eggs
- price: 0.50
- quantity: 12
- !omap
- name: Milk
- *id001
- quantity: 1
这会导致大型数据集出现问题,因为别名可能彼此无法接近,因此难以阅读。
答案 0 :(得分:2)
你为什么使用YAML :: Omap?
更简单,更简洁的解决方案是首先将数据读入哈希数组中,如下所示:
a = [ {'name' => 'Ham', 'price' => 2.00, 'quantity' => 1},
{'name' => 'Eggs', 'price' => 0.50, 'quantity' => 12},
{'name' => 'Milk', 'price' => 2.00, 'quantity' => 2} ]
然后就这样做:
a.to_yaml
导致:
---
- price: 2.0
name: Ham
quantity: 1
- price: 0.5
name: Eggs
quantity: 12
- price: 2.0
name: Milk
quantity: 2
这会对你有用吗?
答案 1 :(得分:1)
这是因为您在同一文档中多次输出同一对象。如果您不想要别名,则需要dup
个对象。比较以下内容:
require 'yaml'
hash = {'a' => 1}
puts [hash, hash].to_yaml
puts
puts [hash, hash.dup].to_yaml
输出:
---
- &1
a: 1
- *1
---
- a: 1
- a: 1
答案 2 :(得分:0)
当YAML太大并且具有嵌套结构时,复制每个对象以扩展别名可能会很复杂。
我使用的一种简单(hacky)方法是将yaml转换为json。然后将其转换回YAML。新的YAML不包含别名/锚点。
require 'json'
jsonObj = oldYaml.to_json
newYaml = YAML.load(jsonObj)
print newYaml.to_yaml
关于这个问题的答案相同: How to emit YAML in Ruby expanding aliases