LoginSignup
11
9

More than 3 years have passed since last update.

[Ruby] CSVファイルをYaml(Yml)に変換する方法

Last updated at Posted at 2020-06-30

手順

1、requireメソッドでRubyの標準ライブラリのcsvyml を読み込む。

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などのクラスメソッドが使える)ができるので便利です。

11
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9