0

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

4

1 回答 1

2

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

一旦解决了这个问题,我仍然需要通过%s/\r//g在 vim 中运行来删除所有的 '^M' 字符。之后一切正常。

于 2014-04-11T12:38:35.260 回答