Ruby YAML没有别名
我正在从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
这会导致大型数据集出现问题,因为别名可能彼此无法接近,因此难以阅读。
你为什么使用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
这对你有用吗?
发生这种情况是因为您在同一文档中多次输出同一对象。 如果您不想要别名,则需要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
当YAML太大并且具有嵌套结构时,复制每个对象以扩展别名可能会很复杂。
我使用的一种简单(hacky)方法是将yaml转换为json。 然后将其转换回YAML。 新的YAML不包含别名/锚点。
require 'json' jsonObj = oldYaml.to_json newYaml = YAML.load(jsonObj) print newYaml.to_yaml
关于这个问题的答案相同: 如何在Ruby扩展别名中发出YAML