Ruby YAML写没有别名

时间:2010-10-20 18:36:50

标签: 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

这会导致大型数据集出现问题,因为别名可能彼此无法接近,因此难以阅读。

3 个答案:

答案 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