YAML
- テキストデータの構造管理を簡単な記述で実現する
- マークアップランゲージではない
参考
-
ドットインストール
- 基本的にドットインストールの写経です
環境準備とお試し
- vagrantでCentOS6.5の仮想環境を準備
- 仮想環境内にはrubyの2.1系をインストール済み
- 以下のディレクトリで作業する
/home/vagrant/yaml_lesson
- ファイル作成
コマンド
touch mydata.yml
touch parse.rb
- YAMLファイルを編集
mydata.yml
- d1
- d2
- d3
- Rubyファイルを編集
parse.rb
require 'yaml'
d = YAML.load_file('mydata.yml')
p d
- Rubyファイルを実行
コマンド
ruby parse.rb
出力
["d1", "d2", "d3"]
シーケンスを扱ってみる
- Rubyで言うところの配列(上記でやったやつ)
- mydata.ymlを編集
mydata.yml
# ハイフン+スペースの後にデータを記述
# インデントでデータのネストも可能
- d1
-
- x1
- x2
- d3
- Rubyファイルを実行
コマンド
ruby parse.rb
出力
["d1", ["x1", "x2"], "d3"]
- インデント時はtabは使えないので注意
マッピングを使ってみる
- Rubyで言うところのハッシュ
- keyとvalueをペアで管理する
- mydata.ymlを編集
mydata.yml
name: taro
address: japan
- Rubyファイルを実行
コマンド
ruby parse.rb
出力
{"name"=>"taro", "address"=>"japan"}
- コロンの後はスペース必須なので注意
- こっちもシーケンスと同じでネスト可能
mydata.yml
name: taro
address:
main: japan
sub : UK
ブロックスタイルとフロースタイル
- 上記までのは「ブロックスタイル」
- 「フロースタイル」をやってみる
- シーケンスは
[hoge, fuga]
といった形で記述 - マッピングは
{key: value}
といった形で記述
- シーケンスは
mydata.yml
[d1, d2, {key: val}, {key2: val2}]
- Rubyファイルを実行
コマンド
ruby parse.rb
出力
["d1", "d2", {"key"=>"val"}, {"key2"=>"val"}]
データ型の解釈
- 基本はオート
mydata.yml
str: hoge
num: 1
num2: 2.2
bool: true
bool2: false
nothing: null
出力
{"str"=>"hoge", "num"=>1, "num2"=>2.2, "bool"=>true, "bool2"=>false, "nothing"=>nil}
- "true"とかダブルクォーテーションで囲めば文字として認識される
改行データをあつかう
-
|
を使う - ラスイチの改行だけを生かす場合は
>
を使う
mydata.yml
d1:
aaa
bbb
ccc
d2: |
aaa
bbb
ccc
d3: >
ddd
eee
fff
出力
{"d1"=>"aaa bbb ccc", "d2"=>"aaa\nbbb\nccc\n", "d3"=>"ddd eee fff\n"}
...と---
-
...
は解釈の終了を意味する -
---
は区切りを意味する
mydata.yml
---
[d1,d2,d3]
---
[d4,d5,d6]
...
---
[d7,d8,d9]
parse.rb
require 'yaml'
File.open('mydata.yml') do |io|
YAML.load_documents(io) do |d|
p d
end
end
出力
["d1", "d2", "d3"]
["d4", "d5", "d6"]
["d7", "d8", "d9"]
...
が効かなかったっぽい
mydata.yml
- d4
- d5
...
- d6
エラー
- parse.rb を戻せば正常に動作した
出力
["d4", "d5"]
- 元のrubyソースはファイル単位で読み込む際に...をただしく解釈したということか