いつもプログラミングお疲れ様です。
この記事が自分にとって初めてのQiitaでの投稿になります。
自分自身の発信力・アウトプット力の向上と、同じような機能を実装したい方への道しるべになればと思い筆をとりました。
Ruby on Railsでアプリを作成している方の手助けになれば幸いです。
大まかな流れ
①モデルを作成する
➁CSVファイルと、CSVを読み込ませるスクリプトファイルを作る
➂スクリプトファイルを実行し、CSVの内容をテーブルに書き込む。
実際の手順
順を追って手順をご紹介いたします。
①モデルを作成する。
ここでは、モデル名を「hoge」とする。
$ rails g model Hoge
マイグレーションファイルにカラムを追加したり、型や制約を加える。
class CreateHoges < ActiveRecord::Migration[6.0]
def change
create_table :hoges do |t|
t.string :name, null: false # 例です
t.integer :foo, null: false # 例です
t.references :user, null: false, foreign_key: true # 例です
t.timestamps
end
end
end
テーブルをマイグレートする。
$ rails db:migrate
➁CSVファイルと、CSVを読み込ませるスクリプトファイルを作る
dbディレクトリに、csvディレクトリを新しく作成する。
db/csv
↓
そのcsvディレクトリ内に、読み込ませたいcsvファイルを置く。
この記事ではfoo.csvファイルとする。
【参考】CSVファイルをVSCodeで編集したり、Excelで編集したりするときに文字化けして困ったときにお世話になった記事
CSVファイルをExcelで開くと文字化けする場合の対処法
↓
スクリプトファイル hoge_script.rb を作成する。分かりやすい名前ならなんでもよい。
この記事においてスクリプトファイルは、Railsプロジェクトのルートディレクトリに置くとする。
後述するスクリプトファイル内で記述するCSVへのパスをいじれば、プロジェクト内のディレクトリのどこに置いても動作するようになるが、この記事ではルートディレクトリに置くという前提で説明していく。
以下はひな形。
require 'csv'
# 1 … CSVファイルのパスを設定する
csv_file_path = 'db/csv/foo.csv' # ルートディレクトリにスクリプトファイルを、db/csvディレクトリにcsvファイルを置いた場合の記述
# 2 … CSVファイルからデータを読み込み、Hogesテーブルに登録
CSV.foreach(csv_file_path, headers: true) do |row|
Hoge.create!(
fuga_1: row['hoge_1'],
fuga_2: row['hoge_2'],
fuga_3: row['hoge_3']
)
end
# 3 … ファイル実行後に、処理が成功したという文章を表示させる。
# ここはお好みで。記述しなくても動作はする。
puts 'Hoge data imported successfully!'
ひな形の解説
まず、スクリプト内の csv_file_path 変数にCSVファイルの相対パスを設定している。
次に、スクリプト内でCSVファイルを読み込み、各行のデータを使用してHogesテーブルに新しいレコードを作成している。
そして最後に。CSVファイルのヘッダー行を考慮して、各列のデータを正しいフィールドに割り当てて登録する、という流れになっている。
➂スクリプトファイルを実行し、CSVの内容をテーブルに書き込む。
いよいよ、CSVファイルをテーブルに書きこむスクリプトを実行する。
コンソールからスクリプトファイルを実行する手順となっている。
ターミナルでコンソールを起動する。
$ rails c
コンソールで次のようにコマンドを打ち込む。
load 'hoge_script.rb'
スクリプトが正常に実行された場合、HogeテーブルにCSVファイル内のデータがインポートされ、"Hoge data imported successfully!" というメッセージが表示される。
もし表示されなかったら、エラーが発生している。
各種エラーへの対処
①CSV::MalformedCSVError: Invalid byte sequence in UTF-8 in line 2.みたいなエラーが出た時
[1] pry(main)> load 'hoge_script.rb'
CSV::MalformedCSVError: Invalid byte sequence in UTF-8 in line 2.
from /home/hogehoge/nantokakanntoka
みたいなエラーが出た時
以下の手順でエラーを解決できるか試してみよう。
CSVファイルをUTF-8エンコーディングで保存し、BOMなしのUTF-8形式に変換するように記述。
# CSVファイルをUTF-8に変換してデータを読み込み、Hogesテーブルに登録
CSV.foreach(csv_file_path, headers: true, encoding: 'bom|utf-8') do |row|
➁テーブルのカラムの1列目が必ず読み込まれない場合
こちらの記事を参考に対処してみよう。
【ruby】CSVファイル読み込み時に1列目のデータが読み込めない時の対応