RubyでYAMLファイルを取り扱う方法


YAMLとは?

YAMLとは、構造化されたデータをプレーンな文字列で表現するためのデータ形式の一つです。

YAMLはRuby関連のライブラリ(特に設定ファイル関連)でよく扱われることもあり、サードパーティのgemを入れなくても標準ライブラリで取り扱いができるようになっています。

設定ファイルとしてよく使われるファイル形式としては、他にはJava文化圏だとpropertiesファイル(最近のSpring FrameworkはYAMLにも対応しているようですが)、JavaScript文化圏だとjsonファイルなどがあります。

本記事では、YAMLファイルを実際に読み込む、あるいはYAMLファイルを書き込む方法について解説します。

YAMLを読み込む

前述したように、YAMLを読み込むモジュールはRuby標準に付属しているため、Gemfileなどの設定は不要です。

いきなり require することで使用することができます。

require 'yaml'

ファイルから読み込む

sample.ymlを用意します。

fuga:
  foo: 1
  bar: 'Hello'
  baz: ['Ruby','Python']

yaml_load_sample.rbを記述します。

YAML.load_fileメソッドは、YAMLファイルをハッシュとして読み込むことができます。

yaml = YAML.load_file('./sample.yml')
puts yml # => {"fuga"=>{"foo"=>1, "bar"=>"Hello", "baz"=>["Ruby", "Python"]}}
puts yml['fuga']['bar'] #=> Hello

あるいは、Kernel#openと組み合わせて以下のようにします。

yaml = YAML.load(open('./sample.yml'))
puts yml # => {"fuga"=>{"foo"=>1, "bar"=>"Hello", "baz"=>["Ruby", "Python"]}}
puts yml['fuga']['bar'] #=> Hello

文字列から読み込む

文字列から読み込む場合はYAML.loadを使います。


yml_str= <<EOS
---
fuga:
  foo: 1
  bar: 'Hello'
  baz: ['Ruby','Python','JavaScript']
EOS

puts YAML.load(yml_str)

YAMLファイルに書き込む

YAML.dump(YAML化したいインスタンス)で、YAML形式の文字列にすることができます。

Kernel#openと組み合わせて、外部のyamlファイルに書き出します。


open('write_yml.yml', 'w') do |f|
  yml = {
      'a' => 'This is a',
      'b' => false,
      'c' => {
          'd' => 1,
          'e' => 2
      }
  }
  f.write(YAML.dump(yml))
end

キーが文字列か、Symbolかに注意する

YAMLファイルを読み込む場合は、キーが文字列かシンボルかに注意しましょう。

キーが文字列なのにシンボルで指定するとnilが返ってきます。(たまにハマります)

yml_str= <<EOS
---
str: hello,yaml!
EOS

puts YAML.load(yml_str)['str'] # => hello,yaml!
puts YAML.load(yml_str)[:str] # => nil

yml_str= <<EOS
---
:str: hello,yaml!
EOS

puts YAML.load(yml_str)['str'] # => nil
puts YAML.load(yml_str)[:str] # => hello,yaml!

まとめ

本記事では、YAMLファイルの取り扱いについて解説しました。

環境依存の固定値などはソースコードにベタ打ちするのではなく、設定ファイルとして管理しておくとメンテナンス性が高まります。

YAMLを自由に取り扱えるようになっておくと、メンテナンス性が高いソースコードを書けるようになるので、ぜひ使い方をマスターしておきたいですね。