CSVライブラリ使いにくいですね〜。少なくとも私は使いにくいです。
備忘録として書き留めます。参考になれば幸いです。
newする
CSV::Rowインスタンスを渡す。それ以外の方法あるのかよくわからない。なんか直感的じゃないと感じる
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row1])
pp table
#<CSV::Table mode:col_or_row row_count:2>
headersを取得する
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row1])
pp table.headers
["header1", "header2"]
row(行)を指定して取得する
[0]はheaderが取れるかもと思っていましたが、ヘッダーを除いた1行目(rowというのかな?)が取れました。
添字?を指定するとheaderではなくrowが取れるということのようです。
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row1])
pp table[0]
pp table[1]
pp table["header1"]
#<CSV::Row "header1":"row1_1" "header2":"row1_2">
nil
headerを指定して取得する
これは直感的な挙動でした。
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row1])
pp table["header1"]
["row1_1"]
CSVファイルの生成
- ここで紹介するのは読み込んでから保存する方法ではなく、ゼロからCSVファイルを生成する方法
- 結局CSV.openを使う事になる
- force_quotesを指定するとダブルクォートで囲ってくれる
- headersの書き込みは引数で行い、rowの書き込みは1行ずつcsv << xxxで行う
headers = ["header1", "header2"]
row1 = CSV::Row.new(headers, ["row1_1", "row1_2"])
row2 = CSV::Row.new(headers, ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
CSV.open("test.csv", "w", headers: headers, write_headers: true, force_quotes: true) do |csv|
table.each { |row| csv << row }
end
$ cat test.csv
"header1","header2"
"row1_1","row1_2"
"row2_1","row2_2"
メソッド化しておく
def save_csv_table(csv_table)
headers = csv_table.headers
CSV.open("test.csv", "w", { headers: headers, write_headers: true, force_quotes: true }) do |csv|
csv_table.each{ |row| csv << row }
end
end