🦓
【完全版】Ruby で CSV を扱う時に見るメモ
たまに CSV 扱う処理を書くとき、いつも 『read だっけ、foreach だっけ、ヘッダってどうするんだっけ』 みたいに悩むので、迷わないように記しておく。
※ 個人的に、row[0], row[1]
みたいなコードが乱立するとめちゃくちゃ読みづらいので、全て headers: true
を指定して、ヘッダ名で要素が取得できるようにしてます。
※ ヘッダの検証する必要ない時はそのコード飛ばしてください
とりあえず一番使うやつ
メモリに余裕があるとき
require 'csv'
path = 'hoge.csv'
ALLOW_HEADERS = %w[id name content].freeze
csv_data = CSV.read(path, headers: true)
return false if csv_data.headers != allow_headers
csv_data.each do |row|
# row['header名']で取得でいる
end
クソデカ CSV でなければ結構これでいける
メモリに気を使うとき
CSVがデカすぎると read
で一気に読み込まずに foreach
で一行ずつ実行する。
一応、foreach
の一行目で header は取得できるが、ループ処理の中でヘッダ検証入れるの分かりにくいので、CSV.open(path, &:readline)
で一行目だけ読み込んでヘッダ検証を行う。
require 'csv'
path = 'hoge.csv'
ALLOW_HEADERS = %w[id name content].freeze
headers = CSV.open(path, &:readline)
return false if csv_data.headers != allow_headers
CSV.foreach(path, headers: true) do |row|
# row['header名']で取得でいる
end
Discussion