【问题标题】:Illegal Quoting error with Ruby CSV parsingRuby CSV 解析的非法引用错误
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2013-08-24
    相关资源
    最近更新 更多