LoginSignup
1
0

More than 3 years have passed since last update.

Ruby: CSV::Tableの使い方備忘録

Posted at

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
1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0