概要

RubyでCSVを扱いたいということがありました。

その時に、いまいち情報が見つけにくく苦労したので、備忘録として残しておきます。

環境

  • Ruby 2.7

CSV出力

RubyでCSVを操作するライブラリとしてcsvがあります。

このライブラリは、Ruby自体に組み込まれているライブラリのため、gemとしてインストールする必要はありません。

今回は、このcsvというライブラリを使いました。

csvを使ったファイルへの出力は次のようにできます。

CSV.open('output.csv', 'wb') do |csv|
  csv << ['item1, 'item2', 'item3']
end

CSV.openでファイルを開き、ブロック引数を利用して、ファイルに書き込みます。 書き込むデータは、配列として渡します。

また、ヘッダーを利用したいということもあるかもしれません。 その場合は、次のようにします。

header = CSV::Row.new(['header1', 'header2', 'header3'], [], header_row: true)

CSV.open('output.csv', 'wb') do |csv|
  csv << header

  row = CSV::Row.new(['header1', 'header2', 'header3'], ['item1', 'item2', 'item3'])
  csv << row
end

ヘッダがある場合は、このような形で実行します。

CSV入力と出力

CSVファイルを読み込んで、同じように出力します。

data = CSV.read('input.csv', headers: true)

CSV.open('output.csv', 'wb') do |csv|
  data.each do |row|
    # データを整形する場合は、ここで整形する
    csv << row
  end
end

rowは、配列と同じような形で参照、変更できます。

ヘッダがある場合は次のようにします。

data = CSV.read('input.csv', headers: true)

CSV.open('output.csv', 'wb') do |csv|
  csv << data.headers
  data.each do |row|
    # データを整形する場合は、ここで整形する
    csv << row
  end
end

ヘッダはdata.headersのような形で参照できます。

ヘッダがある場合、読み込んだCSVデータはハッシュと同じような形で参照、変更ができます。

さいごに

Rubyの特徴として柔軟な言語構造があります。そのせいか、csvの扱い方を調べても、いまいちまとまったものがなかったり、書いてある内容が微妙に異なったりして困惑しました。

csvの扱い方の参考になれば幸いです。