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