人生のヒント

私が経験したことが、誰かの人生のヒントになればと願い書きます。

Ruby On RailsでDBからCSVをインポート・エクスポートする

スポンサーリンク

f:id:hinthint:20160912092258j:plain

今回は、Ruby On RailsでDBからCSVファイルをインポート・エクスポートしたい時に私が使っている方法を書きます。

下記サイトを参考にしました。

http://rails.densan-labs.net/report/csv_export_basic.html

http://qiita.com/nigohiroki/items/625499f8941c0a0338d3

 

ちなみにCSVとは、Wikipeidaによると、下記です。

comma-separated values(略称:CSV)は、いくつかのフィールド(項目)を区切り文字であるカンマ「,」で区切ったテキストデータおよびテキストファイル。拡張子は .csv、MIMEタイプは text/csv。

 

1.CSVファイルをDBからエクスポートする

rootでログインします。

# su - rails

$ cd work/foo

$ vi app/models/concerns/csv_exportable.rb

app/models/concerns/csv_exportable.rbファイルに下記を記述します。

require 'csv'

module CsvExportable
  extend ActiveSupport::Concern

  module ClassMethods
    def to_csv(header: column_names, columns: column_names, row_sep: "\r\n", encoding: Encoding::CP932)
      records = CSV.generate(row_sep: row_sep) do |csv|
        csv << header
        all.each { |record| csv << record.attributes.values_at(*columns) }
      end
      records.encode(encoding, invalid: :replace, undef: :replace)
    end
  end
end

 

以下コマンドを実行します。

$ vi app/models/user.rb

app/models/user.rbファイルのclass User < ActiveRecord::Base~end内に下記を記入します。

include CsvExportable

 

 

以下コマンドを実行します。

$ /etc/init.d/unicorn restart

$ rails c

> user = User.all.to_csv

> f = File.open('file.csv', 'w')

> f.puts user

> f.close

> exit

$ cat file.csv

file.csvファイルが正常に出力されることを確認して完了です。

 

 

2.CSVファイルをDBへインポートする

インポートしたいCSVファイル(file.csv)は予め準備する必要があります。

rootでログインします。

# su - rails

$ cd work/foo

$ vi db/seeds.rb

db/seeds.rbファイルを以下のように記載します。

require "csv"

if File.exist?('db/file.csv') == true
CSV.foreach('db/file.csv').each do |row|
  User.find_or_create_by(:id => row[0], :name => row[1])
end
end

以下コマンドを実行します。

$ rake db:seed

 DBにインポートされていることを確認します。

 

 

3.まとめ

データの出し入れを効率的に行う時に、CSVファイルを使うと便利な時があります。

時と場合によって使い分けましょう。