2010-10-20 19 views
5

Estoy escribiendo datos en archivos yaml de ruby ​​y frecuentemente obtengo alias salpicado sobre el archivo. Cosas como:Ruby YAML escribe sin alias

- &id001 
    somekey: somevalue 
- *id001 

En mi caso estoy usando los archivos YAML a ayuda legibilidad y añadir nombres a los valores en los archivos como los datos existentes es sólo | valores separados con ninguna tecla. ¿Cómo puedo evitar que los archivos yaml se escriban con alias?

[Editar]

Para más aclaración aquí es un ejemplo del tipo de datos y problema.

Los datos originales se parece a:

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

y he escrito un guión de rubí para convertirlo en YAML, que también se ve en un archivo SQL para obtener los nombres apropiados. El archivo yaml parece:

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

Esto causa un problema en grandes conjuntos de datos, porque los alias pueden ser ni de lejos uno del otro y hace que sea difícil de leer.

+1

Se puede publicar la clase que obtiene serializado a este YAML? –

+0

No es una clase que se serializa, es una matriz de YAML :: Omap. Esperemos que el ejemplo lo aclare. –

Respuesta

2

¿Por qué usa YAML :: Omap's?

Una solución mucho más simple y más limpia sería leer primero los datos en una matriz de hashes, como tal:

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

y luego simplemente hacer:

a.to_yaml 

resultando en:

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

¿Eso funcionaría para usted?

+0

Los archivos yaml en algún momento se vuelven a escribir en esos archivos separados por tubería. En este orden es importante y descubrí que cuando se usa un hash normal, el orden de los elementos puede complicarse. –

+0

Supongo que estás usando Ruby 1.8, entonces? Tienes razón, los hash no están ordenados en Ruby 1.8, por lo que el orden de los elementos puede cambiarse. ¿El orden de los elementos es relevante en el archivo YAML, o solo el tubo está separado? Si es así, puede considerar simplemente reordenar los elementos al convertir de YAML al archivo separado por tubería. –

+0

Podría hacer esto pero ¿resolvería mi problema? ¿Crees que el hecho de que estoy usando Omap está causando que se agreguen alias? –

1

Esto ocurre porque está produciendo el mismo objeto varias veces en el mismo documento. Si no quiere alias, necesita dup los objetos. Compare los siguientes:

require 'yaml' 

hash = {'a' => 1} 

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

Salida:

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

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

Puede ser complicado para dup cada objeto de ampliar los alias cuando YAML es demasiado grande y han anidado estructuras.

Un enfoque simple (hacky) que utilicé fue convertir el yaml a json. y luego convertirlo nuevamente a YAML. nuevo YAML no contiene alias/anclajes.

require 'json' 

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

La misma respuesta en esta pregunta: ¿ How to emit YAML in Ruby expanding aliases