2010-10-20 64 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