LoginSignup
5
5

More than 5 years have passed since last update.

標準ライブラリ csv に Missing or stray quote in line *** とか言われたら

Posted at

このような 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 に軽く目を通した限りではバックスラッシュによるエスケープ方法はなさそうですが、どうやってこのファイルができたのか謎は深まるばかり。
でもとりあえず問題は解決したのでよしとする。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5