Ruby CSV不理解\ r \n作为行结束

che*_*one 7 ruby csv

我使用iPhone应用程序定期通过电子邮件向我发送CSV格式的日志.我有一个ruby脚本,它将该日志中的数据与旧日志相加.最近,应用程序开发人员发布了一个更新,由于某些未知原因,在每行的末尾添加了一个回车符,导致我的脚本失败.根据文档,:row_end默认情况下:auto应该接受\r\n或者\n(在1.9.2中).我尝试过使用Ruby 1.8.7,1.9.2和FasterCSV 1.8.7.我通过这些不同的尝试获得各种错误消息,包括

  • CSV::IllegalFormatError
  • 不带引号的字段不允许\r\n(第1行)(FasterCSV::MalformedCSVError)
  • 不能重复NilClass(TypeError)

在1.9.2.(\r不在字段中,它是行的结尾!)以前的数据看起来像这样:

03-12-2012 07:59,120.0,
03-11-2012 08:27,120.0,
03-10-2012 07:57,120.0,
Run Code Online (Sandbox Code Playgroud)

现在它看起来像这样:

03-12-2012 07:59,120.0,^M
03-11-2012 08:27,120.0,^M
03-10-2012 07:57,120.0,^M
Run Code Online (Sandbox Code Playgroud)

认为CSV可能在考虑^M最后一个字段,我尝试添加另一个逗号:

03-12-2012 07:59,120.0,,^M
Run Code Online (Sandbox Code Playgroud)

无济于事.

我唯一能想到的是CSV要求所有字段都是双引号?我可以想到各种解决方法,例如首先读取文件,扼杀结束,然后用CSV处理数组,但首先我想找出我做错了什么.它似乎应该工作.

顺便说一句,我的代码很简单:

CSV.foreach(File.join($import_dir, file)) do |record|
Run Code Online (Sandbox Code Playgroud)

我试过设置:row_end => "\r\n"无济于事.

我在Mac OS X 10.6.8上.

Rya*_*yan 6

由于CSV需要在row_end自动时读取/解析整个文件,因此我需要执行以下操作以防止格式化和编码异常.

  • 通过解码文件 File.read
  • 删除那些讨厌的回车(可能是一个或多个)
  • 将已清理的文件解析为CSV
file = File.read(temp_file.path, encoding: 'ISO-8859-1:UTF-8')
file = file.tr("\r", '')

CSV.parse(file, headers: true) do |row|
  # do all the things
end
Run Code Online (Sandbox Code Playgroud)

注意:我使用的是Ruby 2.1.3版本的Rails 4应用程序.


Fre*_*ung 5

尝试设置row_end

"\r\n"
Run Code Online (Sandbox Code Playgroud)

这与'\ r \n'不同:单引号字符串只允许你转义'和\,任何其他东西都被视为文字\,即

'\r' == "\\r"
Run Code Online (Sandbox Code Playgroud)

是真的


Mar*_*mas 3

在 1.9.3 中为我工作:

mark@ubuntu:~$ irb
1.9.3p0 :001 > require 'csv'
 => true
1.9.3p0 :002 > CSV.foreach("rn.csv") do |row|
1.9.3p0 :003 >   p row
1.9.3p0 :004 > end
["1","2","3","4","5"]
["6","7","8","9","10"]
Run Code Online (Sandbox Code Playgroud)

该文件中确实有回车符:

mark@ubuntu:~$ od -a rn.csv
0000000   1   ,   2   ,   3   ,   4   ,   5  cr  nl   6   ,   7   ,   8
0000020   ,   9   ,   1   0  cr  nl
0000027
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的提示。没想到用od查看文件。结果该行以 \r\r\n 结尾。 (2认同)