Руби YAML пиши без псевдонимов - PullRequest
5 голосов
/ 20 октября 2010

Я записываю данные в файлы yaml из ruby, и мне часто пишут псевдонимы о файле. Вещи как:

- &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 ]

2 голосов
/ 21 октября 2010

Почему вы используете YAML :: Omap's?

Гораздо более простым и понятным решением было бы сначала считывать данные в массив хэшей, например:

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 голос
/ 16 февраля 2015

Это происходит потому, что вы выводите один и тот же объект несколько раз в одном и том же документе. Если вам не нужны псевдонимы, вам нужно 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 голосов
/ 07 сентября 2017

Может быть сложно дублировать каждый объект для расширения псевдонимов, когда YAML слишком большой и имеет вложенные структуры.

Один из простых (хакерских) подходов, который я использовал, заключался в преобразовании yaml в json.а затем преобразовать его обратно в YAML.Новый YAML не содержит псевдонимов / якорей.

require 'json'

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

Тот же ответ на этот вопрос: Как создать YAML в расширяющих псевдонимах Ruby

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...