Ruby CSV解析时出现非法引用错误

时间:2014-04-11 11:46:24

标签: ruby csv control-characters

我知道有很多类似的问题,但我还没有找到解决方案。我正在尝试使用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个字符,但为什么只有在取消引用第一个值时它才会起作用?

1 个答案:

答案 0 :(得分:1)

导致Illegal quoting错误的问题是由文件开头的字节顺序标记(BOM)引起的。它没有出现在编辑器中,但Ruby CSV lib在它上面窒息除非设置了 :encoding => 'bom|utf-8'

修复后,我仍然需要通过在vim中运行%s/\r//g来删除所有“^ M”字符。之后一切都很好。