手順
1、requireメソッドでRubyの標準ライブラリのcsvとyml を読み込む。
require 'csv'
require 'yaml'
2、CSV.read(path_to_csv, :headers => true)
を実行すると、CSV::tableクラスのインスタンスが返ってくる。
map
メソッドで要素(CSV::Rowクラスのインスタンス)を一つずつ取り出し、その要素をto_h
メソッドでハッシュ化する。mapメソッドの返り値は配列となるため、ハッシュを要素とした配列が作成される。今回:header => true
オプションを付け加えたことでハッシュのkey名がCSVのカラム名になっているところがポイント。
hash_arr = CSV.read(path_to_csv, :headers => true).map(&:to_h)
=>[{"region_id"=>"1", "country_id"=>"1", "region_name"=>"北海道"}, {"region_id"=>"2", "country_id"=>"1", "region_name"=>"青森県"},...]
3、pathで指定されたファイルを書き込みモードでオープンし、2のハッシュを要素とする配列をYamlに変換して保存。
File.open(path_to_yaml, 'w') { |f| f.write(hash_arr.to_yaml) }
追記:以下でも同様の書き込みができるらしい。コメントありがとうございます!
IO.write path_to_yaml, hash_arr.to_yaml
P.S
ここからは余談ですが、DBで基本的に値が変更されないテーブル(国や地域)を管理していたので、それをActiveYamlで管理するために今回の変換しました。ActiveYamlで管理してもActiveRecordのようにテーブルを操作すること(allやfindなどのクラスメソッドが使える)ができるので便利です。