我知道有很多类似的问题,但我还没有找到解决方案。我正在尝试使用Ruby 1.9.1的CSV解析库,但我一直在:
/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中创建的,但是我用它来运行Ruby脚本的Ubuntu 12.04,如下所示:
require 'csv'
CSV.foreach('out.csv', :col_sep => ';') do |row|
puts row
end
没有什么复杂的,只是一个测试,所以我认为它必须是导致问题的Windows控制字符。 Vim出现了这个:
“第1部分”;;;; ^ M
;;;; ^ M
;;;; ^ M
未能提交所得税申报表;;;; ^ M
姓名;地址;职业;“没有收费”;“罚款/罚款”^ M
一些名字;“一些,地址”; Bookkeeper; 3; 1,250.00 ^ M
一些名字;“一些,地址”; Haulier; 1; 600.00 ^ M
一些名字;“一些,地址”;脚手架雇用; 1; 250.00 ^ M
一些名字;“一些,地址”;农民; 2; 500.00 ^ M
一些名字;“some,address”; Builder; 2; 3000.00
我已尝试删除Windows添加的carraige返回的控制字符(^ 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
个字符,但为什么只有在取消引用第一个值时它才会起作用?
答案 0 :(得分:1)
导致Illegal quoting
错误的问题是由文件开头的字节顺序标记(BOM)引起的。它没有出现在编辑器中,但Ruby CSV lib在它上面窒息除非设置了 :encoding => 'bom|utf-8'
。
修复后,我仍然需要通过在vim中运行%s/\r//g
来删除所有“^ M”字符。之后一切都很好。