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