🦓

【完全版】Ruby で CSV を扱う時に見るメモ

2024/11/20に公開

たまに 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