2010-10-20 63 views
5

我正在写入数据到红宝石yaml文件,我经常得到有关文件点缀的别名。事情是这样:红宝石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 

这使得在大型数据集的问题,因为别名可能远不及对方,这使得它难以阅读。

+1

你能张贴被序列化到这个YAML类:在这个问题上

require 'json' jsonObj = oldYaml.to_json newYaml = YAML.load(jsonObj) print newYaml.to_yaml 

相同的答案? – 2010-10-20 19:02:36

+0

它不是被序列化的类,它是YAML :: Omap的数组。希望这个例子更清楚。 – 2010-10-21 11:05:48

回答

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 

会为你工作吗?

+0

某些时候yaml文件被写回到那些管道分隔的文件中。在这些顺序中很重要,我发现当使用正常散列时,项目的顺序可能会混乱。 – 2010-10-22 09:30:49

+0

我认为你使用的是Ruby 1.8,然后呢?你是对的,哈希不是在Ruby 1.8中排序的,所以元素的顺序可能会改变。 YAML文件中的元素的顺序是相关的,还是只是管道分离的顺序?如果是这样,你可能会考虑简单地重新排序从YAML转换到管道分隔文件的元素。 – 2010-10-22 11:12:24

+0

我可以做到这一点,但它会解决我的问题吗?你认为我使用Omap的事实是造成别名吗? – 2010-10-22 11:44:29

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 
0

它可以是复杂的DUP每个对象扩大别名时YAML过大,有嵌套结构。

我使用的一种简单的(hacky)方法是将yaml转换为json。然后将其转换回YAML。新的YAML不包含别名/锚。 How to emit YAML in Ruby expanding aliases