2012-01-10 14 views
6

の配列を生成し、私は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 

私はこのファイルからデータを読み込み、そして下に与えられた出力を生成する必要があります - 被験者1にはスキルレベルがないため、このようになります。配列の最初の要素がnullであることを意味します。第2の主題については

["","Act 1", "A"], ["","Act 2", "B"] 

それはこのようになります - 私はエビのPDFテーブルを生成するために、これらの値を使用しています

["Skill 1","Act 1", "B"], ["","Act 2" "B"],["Skill 2","Act 1", "B"] 

。どんな助けでも大歓迎です。

私はこれをやってみました -

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 

乾杯を!

答えて

13

まず、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 

ファイルを正しく読み込む必要があります。 YAMLモジュールのload_fileメソッドを呼び出します。いいえ:: 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 
+0

wow!ありがとう、それは確実に私の問題を解決するために私は長い道のりを取るだろう。 – verdure

6

データ用の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を生成することによって生成されたことを証明することができます何それはあなたがそれを比較させる、返された構造体などのように見える、と平等性チェックによって:

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 
関連する問題