🖥
よく分からない #Ruby の CSV#read と CSV#open の違い
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プログラマの皆さん
適度に休みを取りましょう。プログラミングは1日1時間まで。

Original by Github issue
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2019-09-26
Discussion