【发布时间】:2014-05-25 13:22:24
【问题描述】:
我知道有很多类似的问题,但我还没有找到解决方案。我正在尝试将 CSV 解析库与 Ruby 1.9.1 一起使用,但我不断收到:
/usr/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift': Illegal quoting in line 1. (CSV::MalformedCSVError)
我的 CSV 文件是在 Windows 7 中创建的,但我使用的是 Ubuntu 12.04 来运行 Ruby 脚本,如下所示:
require 'csv'
CSV.foreach('out.csv', :col_sep => ';') do |row|
puts row
end
没什么复杂的,只是一个测试,所以我认为一定是 Windows 控制字符引起了问题。 Vim 显示如下:
“第 1 部分”;;;;^M
;;;;^M
;;;;^M
未能提交所得税申报表;;;;^M
姓名;地址;职业;“收费”;“罚款/罚款 £”^M
一些名字;“一些,地址”;簿记员;3;1,250.00^M
一些名字;“一些,地址”;Haulier;1;600.00^M
一些名字;"一些,地址";脚手架租用;1;250.00^M
一些名字;“一些,地址”;农民;2;500.00^M
一些名字;“一些,地址”;Builder;2;3000.00
我已尝试删除 Windows 添加的回车 (^M) 的那些控制字符,但 %s/^V^M//g 和 %s/^M//g 导致未找到任何模式。如果我运行%s/\r//g,则删除 ^M 字符,但是当我运行 Ruby 脚本时,同样的错误仍然存在。我也尝试过运行set ffs=unix,dos,但没有效果。谢谢。
更新:
如果我删除第一行 Part 1 周围的双引号,那么脚本会打印出它应该输出的内容,然后抛出一个新错误:Unquoted fields do not allow \r or \n (line 10)。如果我然后删除 \r 字符,则脚本运行良好。
我知道我必须删除 \r 字符,但为什么只有取消引用第一个值才能起作用?
【问题讨论】:
-
只是为了调试,做
File.readlines('out.csv')看看每行末尾的字符是什么。 -
我只是在那里运行了一些测试,如果我删除第一行“第 1 部分”周围的引号,那么就没有错误,它打印出 csv 值就好了??
-
我只是在看一个类似的问题/答案,这似乎是一个受欢迎的问题。无论如何,我将编码设置为 'bom|utf-8' 运行它并且运行良好(前提是
\r已被删除)。感谢您的所有帮助@ArupRakshit -
很高兴为您提供帮助.. 您无需手动删除 ^M,请使用
:row_sep => "\r"
标签: ruby csv control-characters