导入CSV报价错误让我疯狂

时间:2011-11-10 01:17:44

标签: ruby csv

我尝试在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...)。 问题是我需要他们用双引号。

有什么想法吗?

1 个答案:

答案 0 :(得分:57)

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

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

只要没有引用任何列,这都应该有用。