2011-11-10 19 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