CSV

とちぎRuby会議07

2017-08-26

とみたまさひろ

  • Ruby歴 約20年
    (本日の老害枠の一人)

  • 得意分野: 文字化け

  • Software Design 2016年12月号
    • 「Rubyと文字コード」/「MySQLと文字コード」
  • Software Design 2017年7月号
    • 「MySQL[SELECT文]集中講座」
  • 今日は長野から5時間かけてきました
    (思ってたより近かった)

その昔RubyのCSVは遅かった

みんな大好き KEN_ALL.CSV

% ruby -v -rcsv -e 'CSV.foreach("KEN_ALL.CSV"){}'
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]

real	0m33.732s
user	0m33.712s
sys	0m0.016s

LightCsvってのを作ったんですよ

% ruby -v -rlightcsv -e 'LightCsv.foreach("KEN_ALL.CSV"){}'
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]

real	0m3.336s
user	0m3.312s
sys	0m0.020s

速い!

でも最近は普通に速い

% ruby -v -Ecp932 -rcsv -e 'CSV.foreach("KEN_ALL.CSV"){}'
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

real	0m2.869s
user	0m2.836s
sys	0m0.020s

LightCsvはお役御免

でも一つ問題が

nilを返しやがる!

require 'csv'

'a,"",b,,c'.parse_csv
#=> ["a", "", "b", nil, "c"]

考慮しないとぬるぽ

require 'csv'

'a,"",b,,c'.parse_csv.each do |col|
  p col.upcase
end
"A"
""
"B"
a.rb:4:in `block in <main>':
 undefined method `upcase' for nil:NilClass (NoMethodError)

誰得 🤔❓

ということでnilを返さないCSVライブラリを作った

RightCSV

require 'rightcsv'

'a,"",b,,c'.parse_csv
#=> ["a", "", "b", "", "c"]

'a,"",b,,c'.parse_csv.map(&:upcase)
#=> ["A", "", "B", "", "C"]

こんなの使わなくてもみんなが幸せになりますように

以上