RubyのCSVでnilを返さなくする方法

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"]]