Edited at

[Ruby] CSVライブラリの使い方

csvファイルのよく使う扱い方をまとめました。


CSVファイルを新たに作成

require 'csv'

CSV.open('file.csv', 'w') do |csv|
csv << ["id", "name", "location"]
csv << [1, "hoge_1", "Kyoto"]
# ...
end


file.csv

id,name,location

1,hoge_1,Kyoto
2,hoge_2,Osaka
3,hoge_3,Shiga
4,hoge_4,Fukui


CSVファイルの内容を追記

CSV.open('file.csv', 'a') do |csv|

csv << [5, "hoge_5", "Nagano"]
end


file.csv

id,name,location

1,hoge_1,Kyoto
2,hoge_2,Osaka
3,hoge_3,Shiga
4,hoge_4,Fukui
5,hoge_5,Nagano


CSVファイルを読み込む

配列として扱う場合

CSV.read('file.csv')

# [["id", "name", "location"], ["1", "hoge_1", "Kyoto"] ... ]

ハッシュとして扱う場合( http://qiita.com/hkengo/items/59ba599ef48c613f2402

CSV.read('file.csv', headers: true)

#<CSV::Table mode:col_or_row row_count:5>


ハッシュからCSVファイル生成例

require 'csv'

module CSVConvertible
def to_csv(*keys)
keys = self.map(&:keys).inject([], &:|) if keys.empty?
CSV.generate do |csv|
csv << keys
self.each { |hash| csv << hash.values_at(*keys) }
end
end
end

users = [
{id: 1, name: 'hoge_1', location: 'Kyoto'},
{id: 2, name: 'hoge_2', location: 'Osaka'},
{id: 3, name: 'hoge_3', location: 'Shiga'},
{id: 4, name: 'hoge_4', location: 'Fukui'}
].extend(CSVConvertible)

IO.write 'file.csv', users.to_csv


file.csv

id,name,location

1,hoge_1,Kyoto
2,hoge_2,Osaka
3,hoge_3,Shiga
4,hoge_4,Fukui

Railsの場合は、ActiveRecordのメソッドを使う。

http://qiita.com/retosu/items/5bda7bd5a55c20fc89c0


参考リンク

https://docs.ruby-lang.org/ja/latest/class/CSV.html

http://qiita.com/hkengo/items/59ba599ef48c613f2402

http://qiita.com/retosu/items/5bda7bd5a55c20fc89c0

http://qiita.com/metheglin/items/439d1fd9b0e0e53c6051