我使用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上.
由于CSV需要在row_end自动时读取/解析整个文件,因此我需要执行以下操作以防止格式化和编码异常.
File.readfile = 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应用程序.
尝试设置row_end为
"\r\n"
Run Code Online (Sandbox Code Playgroud)
这与'\ r \n'不同:单引号字符串只允许你转义'和\,任何其他东西都被视为文字\,即
'\r' == "\\r"
Run Code Online (Sandbox Code Playgroud)
是真的
在 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)
| 归档时间: |
|
| 查看次数: |
6133 次 |
| 最近记录: |