LoginSignup
10
14

More than 5 years have passed since last update.

RailsでCSVファイルのデータをDBに取り込む

Last updated at Posted at 2019-03-01

これまで「CSVファイルのデータを取り込んで表示する」という経験がなかったのですが、とある課題の中で必要になったので備忘録。

Ruby 2.5.1
Rails 5.2.2

RubyのCSVライブラリを利用する

「使いたい/欲しいと思った機能は大抵既に実装されている」みたいなことは勉強していく中でよく聞く言葉だが、CSVファイルを扱う機能もそれに違わず実装済み。

CSVライブラリはその名の通りCSVファイルを扱うライブラリ。

CSVライブラリには例外クラスも含めると5つのクラスがあるが、今回は割愛。

CSVクラス

このクラスは 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を使う

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行ずつブロックに渡していくので、以下のようなコードで対応するテーブルに値を渡す。

user.csv
ID, Name, Email, City
1, Sato, hoge@example.com, Tokyo
2, Suzuki, foo@example.com, Osaka
3, Tanaka, bar@example.com, Fukuoka
db/seeds.rb
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でデータを読み込ませれば完了。

他に何か方法あるのかも調べたい。

10
14
0

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
10
14