こんにちは! フリーエンジニアの長瀬です。
みなさんはYAMLを使っていますか?
YAMLは構造化されたデータを表現するためのフォーマットで、設定ファイルやログファイルなどでよく使われています。
YAMLを使えば、簡潔にデータを取り扱うことができて便利です。
この記事では、YAMLの使い方について
【基礎】YAMLとは
【基礎】YAMLの読み込み
【基礎】YAMLの書き込み
【発展】配列やハッシュをネストする
【発展】スカラーの自動データ型判別
【発展】フロースタイルでの記法
【発展】YAMLの成形
といった内容についても解説していきます。
YAMLとは
YAMLとは正式名称を「YAML Ain’t Markup Language」と言います。
冒頭にも書いたように、構造化されたデータを扱うフォーマットです。
設定ファイルやログファイルによく使用されています。
YAMLでは主に、配列、ハッシュ、スカラーの3 つを組み合わせてデータを表現します。
配列
配列は先頭に「-」を付けて表現します。
「-」の後ろには半角スペースが必要である点に注意が必要です。
- hoge
- foo
ハッシュ
ハッシュは「キー: 値」の形式でコード化します。
コロン(:)の後ろに半角スペースを 1 つ以上入れるようにしてください。
半角スペースの代わりとしてTabコードは使えませんのでご注意を。
A: hoge
B: foo
C: bar
スカラー
スカラーという言葉自体はよく、ベクトルと比較して使われます。
ベクトルが速度のように大きさと方向を持つ量に対して、スカラーは大きさのみを持つ量を指します。
なので、Rubyでは配列やハッシュのような、他のデータを要素としてもつデータはコレクションと呼び、それ以外のデータはスカラーと呼んで区別しています。
それ以外のデータは具体的には文字列や数値、真偽値などですね。
スカラーの具体例を下記に示します。
decimal: 100 # 整数 (10 進数)
octal: 0234 # 整数 (8 進数)
hexa: 0xFF # 整数 (16 進数)
float1: 0.05 # 浮動小数点
bool1: true # 真
bool2: false # 偽
date: 2017-01-01 # 日付
str1: 'true' # 文字列
YAMLの読み込み
YAMLファイルは外部ファイルとして保存し、それを読み込むことができます。
読み込む際にはload_file()を使います。
- Monday
-
- ご飯作り
- 掃除
- 会議
上記のYAMLファイルを読み込むときは下記のようにコーディングします。
require 'yaml'
puts YAML.load_file('schedule.yaml').join(",")
load_file()の引数としてYAMLファイル名を指定します。
[実行結果]
Monday,,ご飯作り,掃除,会議
YAMLの書き込み
次にYAMLファイルへ書き込む方法についてです。
書き込みにはdump()メソッドを用います。
YAML.dump( ['hoge', 'foo', 'bar'],
File.open('sample.yml', 'w') )
# hoge, foo, bar
1つ目の引数にはYAMLフォーマットへ変換するオブジェクト、2つ目の引数には変換したYAMLを出力する先のIOオブジェクトを指定します。
配列やハッシュをネストする
インデントを深くしていくことで、配列やハッシュはネスト化することができます。
[配列の場合]
- apple
-
- banana
- grape
- peach
[実行結果]
["apple", ["banana", "grape"], "peach"]
このように、第2要素がbananaとgrapeの配列になります。
[ハッシュの場合]
A: apple
B:
B1: banana
B2: grape
C: peach
[実行結果]
{"A"=>"apple", "B"=>{"B1"=>"banana", "B2"=>"grape"}, "C"=>"peach"}
配列の場合と同様に第2要素にハッシュが入っています。
インデントをさらに深くしていくことで、さらにネストを深くしていくことができます。
また、配列の中にハッシュを含めたり、ハッシュの中に配列を含めたりといってたことも可能です。
スカラーの自動データ型判別
スカラーのデータは自動で型が判別されます。
実際に値によって型が自動で判別されるのかサンプルコードで確かめていきましょう。
decimal: 144 # 10進数
octal: 0234 # 8進数
hexa: 0xEB # 16進数
float: 0.21 # 浮動小数点
bool_true1: true # 真
bool_true2: yes # 真
bool_ture3: on # 真
bool_false1: false # 偽
bool_false2: no # 偽
bool_false3: off # 偽
null: null # Null
date: 2017-08-24 # 日付
stamp: 2017-08-024 03:24:25 +09:00 # タイムスタンプ
string: 'bar' # 文字列
symbol: :bar # シンボル
[実行結果]
{"decimal"=>144, "octal"=>156, "hexa"=>235, "float"=>0.21, "bool_true1"=>true, "bool_true2"=>true, "bool_ture3"=>true, "bool_false1"=>false, "bool_false2"=>false, "bool_false3"=>false, nil=>nil, "date"=>#, "stamp"=>"2017-08-024 03:24:25 +09:00", "string"=>"bar", "symbol"=>:bar}
このように、例えば0xEBは16進数として自動で判別されていることがわかります。
フロースタイルでの記法
これまでのインデントの深さによって記述する方法はブロックスタイルと呼ばれます。
それに対して、なじみのある{}や[]の記号でデータを記述するる方法はフロースタイルと呼ばれます。
[配列の場合]
[hoge, foo, bar]
[実行結果]
["hoge", "foo", "bar"]
[ハッシュの場合]
{ A: apple, B: banana, C: orange }
[実行結果]
{"A"=>"apple", "B"=>"banana", "C"=>"orange"}
このように、Rubyでおなじみの記法でYAML形式でデータを扱うことができます。
YAMLの成形
RubyでYAML形式のファイルを読み込むときは、load()メソッドを使うこともできます。
load()メソッドの引数にはファイルオブジェクトを指定します。
引数にはYAML形式の文字列を指定することもできます。
以下のファイル(sample.yml)を読み込むとして説明します。
fruits:
- Banana
- Apple
- Grape
以下は sample.yml をパースするコードです。
require 'yaml'
data = open('sample.yml', 'r') { |f| YAML.load(f) }
p data
#実行結果
{"fruits"=>;["Banana", "Apple", "Grape"]}
YAML形式のデータがハッシュオブジェクトに変換されて表示されます。
ハッシュオブジェクトを変更して、それをsample.yamlに書き込むなどして成形することができます。
まとめ
この記事では、YAMLの使い方を解説しました。
基本的なYAMLの使い方をご理解していただけたかと思います。
プログラミングにおいてデータとロジックを分離させるのは基礎的なことでもありますので、YAMLファイルを上手く活用してデータを外に出すようにしましょう。
もしYAMLの使い方について忘れてしまったら、この記事を確認してくださいね!