このような CSV ファイルがあって、
test.csv
foo,bar,baz
hoge,"f\"u\"ga",piyo
適当にパースしようとしたところエラーになりました。
$ cat test.csv | ruby -rcsv -e 'CSV(STDIN).each {|r| p r }'
["foo", "bar", "baz"]
/home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1844:in `block (2 levels) in shift': Missing or stray quote in line 2 (CSV::MalformedCSVError)
from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1817:in `each'
from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1817:in `block in shift'
from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1777:in `loop'
from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1777:in `shift'
from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1719:in `each'
よくみるとダブルクォートのエスケープが変ですね。
\" を "" に置換してから再度チャレンジ。
$ sed -e 's/\\"/""/g' test.csv | ruby -rcsv -e 'CSV(STDIN).each {|r| p r }'
["foo", "bar", "baz"]
["hoge", "f\"u\"ga", "piyo"]
RFC4180 に軽く目を通した限りではバックスラッシュによるエスケープ方法はなさそうですが、どうやってこのファイルができたのか謎は深まるばかり。
でもとりあえず問題は解決したのでよしとする。