Загрузка и генерация файла Yaml с похожими ключами - PullRequest
9 голосов
/ 16 июня 2011

У меня есть документ в файле yaml с похожими ключами: -

sample_file.yml

line:
  title: line-name
  department: transcription

  input_formats:
    - input_format:
        name: company
        required: true
        valid_type: general
    - input_format:
        name: website
        required: false
        valid_type: url

После генерации new_file.yml ключи сортируются в алфавитном порядке: -

new_file.yml

line: 
  department: transcription
  input_formats: 
    - 
      input_format: 
      name: company
      required: true
      valid_type: general
    - 
      input_format: 
      name: website
      required: false
      valid_type: url

  title: line-name

код для открытия sample_file и создания нового_файла ниже: -

require 'yaml'
require 'ya2yaml'


@file = YAML::load(File.open("/Users/manish/Desktop/yaml/sample_file.yml"))
@new_file = File.new("/Users/manish/Desktop/yaml/new_file.yml", "w+") 
@new_file.syswrite(@file.ya2yaml(:hash_order => ['title','department','input_formats']))

Я использую гем "ya2yaml" для создания файла yaml. Чтобы получить тот же порядок, что и в sample_file.yml, я использовал здесь hash_order @new_file.syswrite(@file.ya2yaml(:hash_order => ['title','department','input_formats'])), но он не работает. Как я могу сохранить заказ?

Ответы [ 3 ]

8 голосов
/ 17 июня 2011

Наконец-то я получил решение проблемы заказа.

: hash_order работает только для хэша верхнего уровня.
, поэтому он работает только тогда, когда я удаляю ключ "line" из моего файла sample_file.yml.Тогда порядок сохраняется.: -

title: line-name
department: transcription

input_formats:
  - input_format:
      name: company
      required: true
      valid_type: general
  - input_format:
      name: website
      required: false
      valid_type: url
2 голосов
/ 16 июня 2011

Можете ли вы изменить формат файла YAML?В вашем файле YAML указан хэш с дублирующимися ключами.Это нет-нет.

Если вместо этого в файле YAML используется список, подобный следующему:

line:
    title: line-name
    department: transcription

    formats:
        - input_format:
          name: company
          required: true
          valid_type: general

        - input_format:
          name: website
          required: false
          valid_type: url
....

Эти дополнительные тире решат вашу проблему для вас.

1 голос
/ 16 июня 2011

YAML предназначен для хранения пар ключ-значение, поэтому их порядок не особенно важен для YAML.

Что может решить вашу проблему, используя Ruby 1.9.2, который учитывает вставкупорядок в хешах (в Ruby 1.8.7 это не так).

...