2
1

More than 5 years have passed since last update.

Unquoted fields do not allow \r or \n

Last updated at Posted at 2017-02-20

やりたかったこと

改行コードがCRLFのCSVの読み込みを行いたい...with ruby

問題点

CSV.foreachを使用すると以下のエラーが発生

Errorメッセージ
Unquoted fields do not allow \r or \n

対象ソース

sample.rb
# オプションは各タイミングで適切な値を設定
CSV.foreach('file_path', headers: true, encoding: 'encoding', quote_char: 'quote_char', col_sep: splitter) do |row|
    # なんか処理
   puts row
end

原因

RubyでのCSV処理のエラー
上記の記事に書いてあるとおりに、CSVの改行コードが問題っぽい
(参考記事のとおりに改行コードをLFに変換するとうまく読み込んでくれます。)

ただし、今回はCRLFの改行コードも読み込めるようにします。

@scivola さんよりコメントをいただきました。

何も考えなくても csv ライブラリーは改行コードが CRLF の CSV ファイルを期待どおり読んでくれますよ。

とのこと...
ふならば何が原因なのだろうか?(CSVファイルにCRLFがまざると現象が起きるのは確認ずみ)
ひとまずは下記の解決策にて一応はやりたいことは実現できているので、同じ現象がおきても何とかはなるはず。。。
ただし、具体的な原因やCSV.foreachを使っての解決策がわかりましたら追記or記事の投稿を行います...

解決策

ここに解決策が書いてありました
CSV - Unquoted fields do not allow \r or \n (line 2)

一度File.readを使ってファイルを読み込んで、中のテキストの改行コードをまとめて書き換えてしまいます。

sample2.rb
# オプションは各タイミングで適切な値を設定
csv_text = File.read('file_path', encoding: 'encoding')
csv_text = csv_text.gsub /^$\n/, ''
i = 0
@csv = CSV.parse(csv_text, headers: true, skip_blanks: true, quote_char: 'quote_char', col_sep: 'splitter')
@csv.each do |row|
    # なんか処理
   puts row
end

もっとよさそうな方法も有る気もしますが、いったん解決したのでOKということに...

その他 (TODO)

singleton method CSV.new
ここに改行コードの指定ができるような記載があったんだけどもなぜかうまくいかなかったので上記解決策をとっています。(row_sep)
暇があれば、singleton method CSV.newの記事の内容でどうにか実現できないか調べてみるのもありかも

2
1
6

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
2
1