hakeの日記

Windows環境でプログラミングの勉強をしています。

YAML

Rubyの勉強

構造化したデータを表現するフォーマットで、XMLと比べて人間がアクセスしやすい形式。インデントでネストの深さを指定する。以下のサンプルでは変数に対して入出力をしているけど、当然ファイルに対しても可能

参考サイト:http://jp.rubyist.net/magazine/?0009-YAML

require 'yaml'

hash1 = {"key1" => 100, "key2" => 200}
hash2 = {"key3" => "300", "key4" => "abc"}
array = ["foo", "bar"]
int = 999
bool = true
null = nil

a = [hash1, hash2, array, int, bool, null]

str = YAML.dump(a)
puts str 
  # => --- 
  # => - key1: 100
  # =>   key2: 200
  # => - key3: "300"   # 文字列の場合は「"」で囲まれる
  # =>   key4: abc
  # => - - foo
  # =>   - bar
  # => - 999
  # => - true
  # => -               # nilは何も出力しない

b = YAML.load(str)
p b[0] # => {"key1"=>100, "key2"=>200}
p b[1] # => {"key3"=>"300", "key4"=>"abc"}


#--------------------------------------------------
a = [0, [1 ,[10, 11]], 2]
str = YAML.dump(a)
puts str
  # => --- 
  # => - 0
  # => - - 1
  # =>   - - 10
  # =>     - 11
  # => - 2
tree = YAML.parse(str)
p tree.search("/*")         # => ["/0", "/1", "/2"]
p n = tree.select("/0")     # => [#<YAML::Syck::Scalar:0x292b268>]
n.each{|i| p i.transform}   # => 0
p n = tree.select("/1/1/1") # => [#<YAML::Syck::Scalar:0x292a8cc>]
n.each{|i| p i.transform}   # => 11


#--------------------------------------------------
str = ""
str =<<EOS
山田太郎:
  TEL:  123-4567
  MAIL: taro@foo.com
田中次郎:
  TEL:  987-6543
  MAIL: jiro@foo.com
EOS
s = YAML.load(str)
p s.size               # => 2
p s["山田太郎"]        # => {"MAIL"=>"taro@foo.com", "TEL"=>"123-4567"}
p s["山田太郎"]["TEL"] # => "123-4567"

tree = YAML.parse(str)
puts tree.search("/*")
  # => /山田太郎
  # => /田中次郎
puts tree.search("/*/*")
  # => /山田太郎/MAIL
  # => /山田太郎/TEL
  # => /田中次郎/TEL
  # => /田中次郎/MAIL
p n = tree.select("/山田太郎/TEL")
  # => [#<YAML::Syck::Scalar:0x29231d0>]
n.each{|i| p i.transform}
  # => "123-4567"
n = tree.select("/*/MAIL")
n.each{|i| p i.transform}
  # => "taro@foo.com"
  # => "jiro@foo.com"