概要
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の扱い方の参考になれば幸いです。