これまで「CSVファイルのデータを取り込んで表示する」という経験がなかったのですが、とある課題の中で必要になったので備忘録。
Ruby 2.5.1
Rails 5.2.2
##RubyのCSVライブラリを利用する
「使いたい/欲しいと思った機能は大抵既に実装されている」みたいなことは勉強していく中でよく聞く言葉だが、CSVファイルを扱う機能もそれに違わず実装済み。
CSVライブラリはその名の通りCSVファイルを扱うライブラリ。
CSVライブラリには例外クラスも含めると5つのクラスがあるが、今回は割愛。
##CSVクラス
https://docs.ruby-lang.org/ja/latest/class/CSV.html
このクラスは CSV ファイルやデータに対する完全なインターフェイスを提供します。
CSVにあるデータを取り込む場合には、CSVクラスを使う。
CSVクラスには特異メソッドとして以下のものがある
filter
foreach
generate
generate_line
instance
new
open
parse
parse_line
read
readlines
table
クラスではなくある特定のオブジェクトに固有のメソッドのこと
###CSV.foreachメソッドでCSVファイルを読み取る
CSVクラスにはCSVファイルを読み込んだり書き込んだりする特異メソッドが複数あるが、CSVファイルを読み込む場合は主にCSV.foreachを使う
foreach(path, options = Hash.new) {|row| ... } -> nil**
->CSVの各行が、与えられたブロックに渡される
・path
CSVファイルが格納されているパスを指定する。
相対パスとは、起点となる位置からみたディレクトリ及びファイルの表現方法。
起点となる位置から階層を1つ上がる場合には`../`を使い、特定のディレクトリに入る場合には`ディレクトリ名/`を使う
・options
CSV.foreachのオプションには、CSV.newと同じオプションを取ることができる。
-> https://docs.ruby-lang.org/ja/latest/method/CSV/s/new.html
特に使うケースが多そうなのがheadersオプション。
以下リファレンスマニュアルからの引用です。
:first_row というシンボルか真を指定すると、CSV ファイルの一行目をヘッダとして扱います。
headers: trueをオプションに渡せば1行目はヘッダとして読み込まないようになる。
CSVファイルでは1行目には各カラムの名前などを入れるケースも多いので、このオプションを使うことも多そう。
##db/seeds.rbでCSVファイルを読み込ませ、データを取り込む
CSV.foreachでCSVファイルのデータを取り込めるようになったら、そのデータをseeds.rbからデータベースに取り込む。
CSV.foreachメソッドではCSVのデータを1行ずつブロックに渡していくので、以下のようなコードで対応するテーブルに値を渡す。
ID, Name, Email, City
1, Sato, hoge@example.com, Tokyo
2, Suzuki, foo@example.com, Osaka
3, Tanaka, bar@example.com, Fukuoka
require 'csv'
CSV.foreach(*path, headers: true) do |row|
User.create(
username: row['Name'],
email: row['Email'],
city: row['City']
)
end
上記のコードで、CSVのデータがDB上に読み込みできるようになる。
ここまで書いたらbin/rails db:seed
でデータを読み込ませれば完了。
他に何か方法あるのかも調べたい。