导入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...)。问题是我需要把它们放在双引号里。

任何想法?

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

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

只要你的列中没有引号,这应该可以工作。

最新更新