2011-11-10 18 views
21

我一直有一段难以置信的时间,试图在ruby-1.9.2中导入CSV文件。导入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>' 

它说有未关闭的报价精密组件,但我可以看到的是,报价打开和关闭。

转义引号没有任何作用。我得到相同的错误([email protected]""seal"" r...)。 将它们更改为单引号可使其起作用([email protected]'seal' r...)。 问题是我需要他们在双引号。

任何想法?

回答

56

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

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

这应该工作,只要不关你的列被引用。

+2

+1 CSV规格。被完全滥用和忽略,与HTML类似。对于这两种情况,有时我会在将数据交给解析器之前解决数据问题。我认为这也是解决这个问题的方法,但我喜欢用'quote_char =>“\ x00”'来欺骗解析器。不错的工作。 –

+2

我有一个实际上具有nul字符的'bcp' MSSQL转储来的UTF-16。为了好玩,我选择了雪人角色(☃)作为替补。 :) –

+0

这个''\ x00“'窍门很漂亮:-) – Avishai