インフラエンジニアbacchiのわかったことまとめ

bacchi.me

YAMLとは一体何か、まとめてみた その2

より複雑なデータの表現方法を見ていきます

前回の記事でYAMLの基本的な書き方について見ていきました。
今回はより複雑なデータの表現方法を見て行きたいと思います!

ブロックスタイルとフロースタイル

今までシーケンスを「- d1(改行)- d2」と表現してきましたが、これをブロックスタイルといいます。
もう一つ表現方法があり、「[d1, d2]」とすることで同じデータ構造を表現できます。

これをフロースタイルといいます。

マッピングにも似たような記法があって、
例えば「name: bacchi」は「{name: bacchi}」と表現することができます。

気をつけるべき点は、ブロックスタイルと同じですが空白が非常に重要で、
「,」のあとには必ず空白、「:」のあとにも必ず空白というのを覚えておくようにしましょう。

例えば「names: [bacchi, bacchi2]」と書いたり、
「emails: {main: bacchi1@test.com, sub: bacchi2@test.com}」
のように簡単に書くことができます。

yamlで使う特殊な記法

次に、yamlで使う特殊な記法についても紹介します。

「...」はそこで解釈を終了せよ、という意味になります。
「---」はデータの区切りを表します。

フロースタイルでどのようにデータが表示されるかと
「---」と「...」の動きについて下記を例に見ていきます。

「…」 そこで解釈を終了 の例

# sample.yml
- d1
- d2
- d3
...
- d4
- d5
- d6

実行結果

% ruby parse.rb
["d1", "d2", "d3"]

d4,d5,d6が出力されると思いきや出力されていません!

「—」 区切り の例

今回は区切り文字を入れているため、
プログラムを一部変更しています。

# parse.rb
require 'yaml'
File.open('sample.yml') do |io|
  YAML.load_documents(io) do |d|
    p d
  end
end
# sample.yml
---
- d1
- d2
---
[d3, d4]
---
name: bacchi
---
{name: bacchi}
---
names:
  - bacchi1
  - bacchi2
emails:
  main: bacchi1@test.com
  sub : bacchi2@test.com
---
names: [bacchi3, bacchi4]
emails: {main: bacchi3@test.com, sub: bacchi4@test.com}

実行結果

% ruby parse.rb
["d1", "d2"]
["d3", "d4"]
{"name"=>"bacchi"}
{"name"=>"bacchi"}
{"names"=>["bacchi1", "bacchi2"], "emails"=>{"main"=>"bacchi1@test.com", "sub"=>"bacchi2@test.com"}}
{"names"=>["bacchi3", "bacchi4"], "emails"=>{"main"=>"bacchi3@test.com", "sub"=>"bacchi4@test.com"}}

1つのドキュメントとして処理されるのではなく、
複数のドキュメントからデータを取り込んだかのように処理されています。

色々なデータの表現

文字列型や数値型、真偽値型の記法をマッピングを例に上げていきます。

文字列型

str: hello

数値型

num1: 5

小数点を含む数値

num2: 34.44

真偽値

bool1: true
bool2: false

null

nothing: null

日付

date: 2014-07-28

数値や真偽値を文字列として表現

「””」で囲ってやれば文字列型として扱われるようになります。

d1: "5"
d2: "true"

マッピングでの改行

# 改行されず、1行のデータとして処理
doc1:
  aaa
  bbb
  ccc
# 全ての行で改行
doc2: |
  aaa
  bbb
  ccc
# 最後の行のみ改行
doc3: >
  aaa
  bbb
  ccc

シーケンスでの改行

# 改行されず、1行のデータとして処理
-
  aaa
  bbb
  ccc
—
# 全ての行で改行
- |
  aaa
  bbb
  ccc
—
# 最後の行のみ改行
- >
  aaa
  bbb
  ccc

これらの例をまとめて見てみます。

# sample.yml
---
#  文字列型
str: hello
---
# 数値型
num1: 5
---
# 小数点を含む数値
num2: 34.44
---
# 真偽値
bool1: true
bool2: false
---
# null
nothing: null
---
# 日付
date: 2014-07-28
---
# 数値や真偽値を文字列として表現
d1: "5"
d2: "true"
---
# マッピングで改行されず、1行のデータとして処理
doc1:
  aaa
  bbb
  ccc
---
# マッピングで全ての行で改行
doc2: |
  aaa
  bbb
  ccc
---
# マッピングで最後の行のみ改行
doc3: >
  aaa
  bbb
  ccc
---
# シーケンスで改行されず、1行のデータとして処理
-
  aaa
  bbb
  ccc
—
# シーケンスで全ての行で改行
- |
  aaa
  bbb
  ccc
—
# シーケンスで最後の行のみ改行
- >
  aaa
  bbb
  ccc

実行結果

% ruby parse.rb
{"str"=>"hello"}
{"num1"=>5}
{"num2"=>34.44}
{"bool1"=>true, "bool2"=>false}
{"nothing"=>nil}
{"date"=>Date: 2014-07-28 ((2456867j,0s,0n),+0s,2299161j)}
{"d1"=>"5", "d2"=>"true"}
{"doc1"=>"aaa bbb ccc"}
{"doc2"=>"aaanbbbncccn"}
{"doc3"=>"aaa bbb cccn"}
["aaa bbb ccc"]
["aaanbbbncccn"]
["aaa bbb cccn”]

2回に分けてYAMLの基本をさらって行きました。

今後応用的なこともまとめていきたいと考えていますのでどうぞよろしくお願いします!

  • B!