Чтение данных из файла yaml и создание массива в ruby
у меня есть следующие данные в файле yaml -
---
- :Subject_list
Subject 1:
:Act 1: A
:Act 2: B
Subject 2:
:Skill 1:
:Act 1: B
:Act 2: B
:Skill 2:
:Act 1: B
мне нужно прочитать данные из этого файла и генерировать выход, который приведен ниже - Для субъекта 1 это будет так, поскольку у него нет уровня квалификации. Значение первого элемента массива равно null.
["","Act 1", "A"], ["","Act 2", "B"]
для второго предмета это будет так -
["Skill 1","Act 1", "B"], ["","Act 2" "B"],["Skill 2","Act 1", "B"]
Я использую эти значения для создания таблицы PDF креветки. Любая помощь очень ценится.
Я пытался сделать это -
data=YAML::load(File.read("file.yaml"));
subject = data[:Subject_list]
sub_list =["Subject 1", "Subject 2"]
sub_list.each do |sub|
sub_data = []
sub_data = subject["#{sub}"]
# I convert the list symbol to an array, so i can loop through the sub activities.
#I need some direction here as how to check whether the symbol will be a skill or activity
end
Ура!!
2 ответов
во-первых, ваш файл yaml не является правильным YAML, у вас не может быть таких ключей, если у вас есть пространство или странность в них, вам нужно их процитировать, и что случилось с : в начале?
"Subject_list":
"Subject 1":
"Act 1": A
"Act 2": B
"Subject 2":
"Skill 1":
"Act 1": B
"Act 2": B
"Skill 2":
"Act 1": B
тогда вам нужно правильно загрузить файл. Вызов метода load_file в модуле YAML. No:: для доступа к методу в ruby afaik.
require 'yaml'
data = YAML.load_file "file.yaml"
subject = data["Subject_list"]
require 'pp'
subject.each do |s|
item = s.last
if item.keys.first =~ /Skill/
pp item.keys.inject([]) { |memo,x| item[x].map { |i| memo << i.flatten.unshift(x) } ; memo}
else
pp item.map { |k,v| ["", k, v] }
end
end
при создании файла YAML для данных, особенно сложной структуры данных, я позволяю YAML генерировать его для меня. Затем я настраиваю по мере необходимости:
require 'yaml'
require 'pp'
foo = ["Skill 1","Act 1", "B"], ["","Act 2" "B"],["Skill 2","Act 1", "B"]
puts foo.to_yaml
когда я запускаю этот код я получаю этот выход:
---
- - Skill 1
- Act 1
- B
- - ""
- Act 2B
- - Skill 2
- Act 1
- B
вы можете доказать, что данные правильно сгенерированы с помощью YAML generate, а затем немедленно проанализировать код и показать, как он выглядит как возвращаемая структура, позволяя сравнить ее и проверить равенство:
bar = YAML.load(foo.to_yaml)
pp bar
puts "foo == bar: #{ foo == bar }"
что бы вывод:
[["Skill 1", "Act 1", "B"], ["", "Act 2B"], ["Skill 2", "Act 1", "B"]]
foo == bar: true