2010-10-20 9 views
5

Sto scrivendo i dati su file yaml da ruby ​​e ottengo spesso alias punteggiati sul file. Le cose come:Ruby YAML scrivere senza alias

- &id001 
    somekey: somevalue 
- *id001 

Nel mio caso io sto usando i file YAML per aiuto leggibilità e aggiungere i nomi ai valori nei file come i dati esistenti si trova a soli | valori separati senza chiavi. Come posso impedire che i file yaml vengano scritti con alias?

[Edit]

Per ulteriori chiarimenti qui è un esempio del tipo di dati e problemi.

I dati originali si presenta come:

Ham|2.00|1 
Eggs|0.50|12 
Milk|2.00|2 

E ho scritto uno script Ruby per convertirlo in YAML, che guarda anche a un file SQL per ottenere i nomi appropriati. Il file YAML assomiglia:

--- 
- !omap 
    - name: Ham 
    - &id001 
    price: 2.00 
    - quantity: 1 
- !omap 
    - name: Eggs 
    - price: 0.50 
    - quantity: 12 
- !omap 
    - name: Milk 
    - *id001 
    - quantity: 1 

Ciò causa un problema in grandi insiemi di dati, perché gli alias possono essere in nessun posto vicino a vicenda e lo rende difficile da leggere.

+1

potete inserire la classe che viene serializzato a questa YAML? –

+0

Non è una classe serializzata, è una matrice di YAML :: Omap. Speriamo che l'esempio lo renda più chiaro. –

risposta

2

Perché stai utilizzando YAML :: Omap?

Una soluzione più semplice e più pulito sarebbe avere letto i dati in un array di hash, in quanto tale:

a = [ {'name' => 'Ham', 'price' => 2.00, 'quantity' => 1}, 
     {'name' => 'Eggs', 'price' => 0.50, 'quantity' => 12}, 
     {'name' => 'Milk', 'price' => 2.00, 'quantity' => 2} ] 

e poi basta fare:

a.to_yaml 

conseguente:

--- 
- price: 2.0 
    name: Ham 
    quantity: 1 
- price: 0.5 
    name: Eggs 
    quantity: 12 
- price: 2.0 
    name: Milk 
    quantity: 2 

Questo lavoro potrebbe funzionare?

+0

I file yaml a un certo punto vengono riscritti in questi file separati da pipe. In questo ordine è importante e ho scoperto che quando si usa un normale hash l'ordine degli oggetti può essere confuso. –

+0

Suppongo che tu stia usando Ruby 1.8, quindi? Hai ragione, gli hash non sono ordinati in Ruby 1.8, quindi l'ordine degli elementi può essere cambiato. L'ordine degli elementi è rilevante nel file YAML o solo nel tubo separato? In tal caso, potresti prendere in considerazione semplicemente il riordinamento degli elementi durante la conversione da YAML al file separato da pipe. –

+0

Potrei farlo ma risolverebbe il mio problema? Pensi che il fatto che sto usando Omap sta causando l'aggiunta di alias? –

1

Ciò accade perché si sta eseguendo l'output dello stesso oggetto più volte nello stesso documento. Se non si desidera l'alias, è necessario dup gli oggetti. Confrontare il seguente:

require 'yaml' 

hash = {'a' => 1} 

puts [hash, hash].to_yaml 
puts 
puts [hash, hash.dup].to_yaml 

uscita:

--- 
- &1 
    a: 1 
- *1 

--- 
- a: 1 
- a: 1 
0

Può essere complicato per dup ogni oggetto per espandere alias quando YAML è troppo grande e hanno nidificato le strutture.

Un approccio semplice (hacky) che ho usato è stato convertire lo yaml in json. e quindi riconvertirlo in YAML. il nuovo YAML non contiene alias/ancore.

require 'json' 

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

Stessa risposta su questa questione: How to emit YAML in Ruby expanding aliases