【问题标题】:Importing CSV quoting error is driving me nuts导入 CSV 引用错误让我抓狂
【发布时间】:2011-12-25 19:30:00
【问题描述】:

我一直在尝试在 ruby​​-1.9.2 中导入 CSV 文件,这令人难以置信。

我要解析的文件有:

  • 列中的逗号
  • 列中的引号
  • 使用“@”作为 :col_sep

csv.txt(代表输入,真实101k行):

㔾@㔾@jié@"seal" radical in Chinese characters, (Kangxi radical 26)

我的代码:

require 'csv'

CSV.foreach("/Users/adam/Desktop/csvtest.txt", {:col_sep => "@"}) do |row|
    puts row.to_s 
end

我想要的输出:

["㔾", "㔾", "jié", "\"seal\" radical in Chinese characters, (Kangxi radical 26)"]

我得到的输出:

CSV::MalformedCSVError: Unclosed quoted field on line 1.
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1910:in `block in shift'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1825:in `loop'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1825:in `shift'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1767:in `each'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1202:in `block in foreach'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1340:in `open'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1201:in `foreach'
from (irb):31
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'

它说有未关闭的引用字段,但我可以看到引号打开和关闭。

转义引号没有任何作用。我得到同样的错误(...@""seal"" r...)。 将它们更改为单引号使其工作 (...@'seal' r...)。 问题是我需要将它们放在双引号中。

有什么想法吗?

【问题讨论】:

  • Ruby 的 CSV 库确实看起来设计得很糟糕

标签: ruby csv


【解决方案1】:

我认为问题在于 CSV 试图将 "seal" 解释为单引号列;但是,它不会显示为@"seal"@,因此解析器会感到困惑,因为引号应该围绕列。我没有看到任何选项告诉 CSV 没有引用这些列,但是您可以通过将 :quote_char 设置为永远不会发生的事情来解决它。如果您使用的是 UTF-8,那么您可以安全地使用零字节作为“永远不会出现的引号字符”:

CSV.foreach(filename, :col_sep => "@", :quote_char => "\x00") do |row|
    #...
end

只要没有引用您的列,这应该可以工作。

【讨论】:

  • +1 CSV 规范。与 HTML 类似,被完全滥用和忽视。对于这两种情况,有时我会在将数据交给解析器之前修复数据。我认为这也可以解决这个问题,但我喜欢你用quote_char =&gt; "\x00" 欺骗解析器的方式。干得好。
  • 我有来自bcp MSSQL 转储的 UTF-16,它实际上具有 nul 字符。只是为了好玩,我选择了雪人角色(☃)作为替代品。 :)
猜你喜欢
  • 2012-08-05
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2011-05-09
  • 2014-05-19
  • 2010-12-03
  • 1970-01-01
相关资源
最近更新 更多