🖥

よく分からない #Ruby の CSV#read と CSV#open の違い

2019/09/26に公開

csv

A,B,C
A,B,C
A,B,C

read

  • その名の通り読み取り専用。
  • 配列の配列で中身を返す。
CSV.read('/tmp/3.csv')
=> [["A", "B", "C"], ["A", "B", "C"], ["A", "B", "C"]]

headers を指定すると CSV::Table クラスのインスタンスが返ってくる

CSV.read('/tmp/3.csv', headers: true)
=> #<CSV::Table mode:col_or_row row_count:3>

each すると繰り返しごとにCSVの行 ( CSV::Row ) が得られる

CSV.read('/tmp/3.csv', headers: true).each { |line| p line}
#<CSV::Row "A":"A" "B":"B" "C":"C">
#<CSV::Row "A":"A" "B":"B" "C":"C">
=> #<CSV::Table mode:col_or_row row_count:3>

書き込みモードで開こうとするとエラーが起こり、なおかつ、ファイルの中身が全て消える。なにこれ。

CSV.read('/tmp/3.csv', 'r')
=> [["A", "B", "C"], ["A", "B", "C"], ["A", "B", "C"]]

CSV.read('/tmp/3.csv', 'w')
# IOError: not opened for reading
# from /Users/yumainaura/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv/parser.rb:202:in `gets'

CSV.read('/tmp/3.csv', 'r')
=> []

open

読み取りじゃなくて色々できるやつ。
CSVクラスのインスタンスが返ってくる

CSV.open('/tmp/3.csv')
=> <#CSV io_type:File io_path:"/tmp/3.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">

headers を指定しても同じ

CSV.open('/tmp/3.csv', headers: true)
=> <#CSV io_type:File io_path:"/tmp/3.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"" headers:true>

each すると繰り返しごとにCSVの行 ( CSV::Row ) が得られる

CSV.open('/tmp/3.csv', headers: true).each { |line| p line}
#<CSV::Row "A":"A" "B":"B" "C":"C">
#<CSV::Row "A":"A" "B":"B" "C":"C">
=> #<CSV::Table mode:col_or_row row_count:3>

open して read すると CSV.read と同じく CSV::Table のインスタンスが返ってくる

CSV.open('/tmp/3.csv', headers: true).read
=> #<CSV::Table mode:col_or_row row_count:3>

ファイルへ書き込みもできる

CSV.open("path/to/file.csv", "wb") do |csv|
  csv << ["row", "of", "CSV", "data"]
  csv << ["another", "row"]
  # ...
end

参考

[Ruby]CSV::Tableが便利 - Qiita

ドキュメントを読みなさいだって?

とてもとてもよくわかるドキュメントが欲しい。

お疲れじゃないですか?Rubyプログラマの皆さん

適度に休みを取りましょう。プログラミングは1日1時間まで。
image

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2526

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-09-26

Discussion