导入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 `' 

它说有未公开的报价,但我可以看到报价开启和关闭。

逃避报价什么也没做。 我得到了同样的错误( ...@""seal"" r... )。 将它们改为单引号使其有效( ...@'seal' r... )。 问题是我需要他们用双引号。

有任何想法吗?

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

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

只要没有引用任何列,这应该可以正常工作。