RubyのCSVライブラリはnilを返すことがあるダメな子だという話を前に書いたんですが、RubyKaigi 2018 で須藤さんに聞いたら「最新のはnilじゃなくて空文字列を返すようにできるはず」と言われたので見てみました。
5/31 にリリースされたばかりの Ruby 2.6.0-preview2 だと、nil_value というオプションが増えてて、従来 nil を返すような場合に nil 以外の値を返すことができるようになってました。
% ruby -v -rcsv -e 'p CSV.parse("a,,b")'
ruby 2.6.0preview2 (2018-05-31 trunk 63539) [x86_64-linux]
[["a", nil, "b"]]
% ruby -v -rcsv -e 'p CSV.parse("a,,b", nil_value:"")'
ruby 2.6.0preview2 (2018-05-31 trunk 63539) [x86_64-linux]
[["a", "", "b"]]
なおRuby2.6未満でもcsv gem をインストールすれば同じようにできます。
% ruby -v -rcsv -e 'p CSV.parse("a,,b", nil_value: "")'
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
Traceback (most recent call last):
3: from -e:1:in `<main>'
2: from /home/tommy/ruby25/lib/ruby/2.5.0/csv.rb:1311:in `parse'
1: from /home/tommy/ruby25/lib/ruby/2.5.0/csv.rb:1311:in `new'
/home/tommy/ruby25/lib/ruby/2.5.0/csv.rb:1519:in `initialize': unknown keyword: nil_value (ArgumentError)
% gem install csv
Fetching: csv-1.0.2.gem (100%)
Successfully installed csv-1.0.2
Parsing documentation for csv-1.0.2
Installing ri documentation for csv-1.0.2
Done installing documentation for csv after 0 seconds
1 gem installed
% ruby -v -rcsv -e 'p CSV.parse("a,,b", nil_value: "")'
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
[["a", "", "b"]]
すばらしい。
nil_value: "" がデフォルトでもいいのになーとは思ったり。
ということで、RightCSV も CSV gem に対応しておきました。
~% gem install rightcsv
Fetching: rightcsv-0.2.0.gem (100%)
Successfully installed rightcsv-0.2.0
Parsing documentation for rightcsv-0.2.0
Installing ri documentation for rightcsv-0.2.0
Done installing documentation for rightcsv after 0 seconds
1 gem installed
~% ruby -rrightcsv -e 'p RightCSV.parse("a,,b")'
[["a", "", "b"]]