2011-11-10 18 views
21

मुझे रूबी-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 

मेरे वांछित आउटपुट: मैं देख सकता हूँ कि

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>' 

इसमें कहा गया है खुली हुई उद्धृत feilds देखते हैं, लेकिन:

["㔾", "㔾", "jié", "\"seal\" radical in Chinese characters, (Kangxi radical 26)"] 

क्या मैं उत्पादन के लिए मिलता है उद्धरण खुला और करीब।

उद्धरण से बचने से कुछ भी नहीं होता है। मुझे एक ही त्रुटि मिलती है ([email protected]""seal"" r...)। उन्हें सिंगल कोट्स में बदलना यह काम करता है ([email protected]'seal' r...)। समस्या यह है कि मुझे उन्हें डबल कोट्स में रहने की आवश्यकता है।

कोई विचार?

उत्तर

56

मुझे लगता है कि समस्या यह है कि सीएसवी "seal" को एक उद्धृत कॉलम के रूप में समझने की कोशिश कर रहा है; लेकिन, यह @"seal"@ के रूप में प्रकट नहीं होता है, इसलिए पार्सर भ्रमित हो जाता है क्योंकि उद्धरण कॉलम को घेरने के लिए माना जाता है। मुझे सीएसवी को बताने का कोई विकल्प नहीं दिख रहा है कि कॉलम उद्धृत नहीं किए गए हैं, लेकिन आप कभी भी ऐसा नहीं होने पर :quote_char सेट करके इसे चारों ओर घुमा सकते हैं।

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

यह रूप में लंबे समय के रूप में अपने कॉलम में से कोई भी उद्धृत कर रहे हैं काम करना चाहिए: आप UTF-8 का उपयोग कर रहे हैं तो आप सुरक्षित रूप से अपने "उद्धरण कैरेक्टर है कि हो कभी नहीं होगा" के रूप में एक शून्य बाइट का उपयोग कर सकते हैं।

+2

+1 सीएसवी स्पेक। एचटीएमएल के समान ही पूरी तरह दुर्व्यवहार और अनदेखा किया जाता है। दोनों के लिए, मैं इसे पार्सर को सौंपने से पहले डेटा को ठीक करने का समय लेता हूं। मुझे लगता है कि इस समस्या के लिए भी एक समाधान होगा, लेकिन मुझे लगता है कि आप 'quote_char => "\ x00" 'के साथ पार्सर को कैसे बेवकूफ़ बना रहे हैं। अच्छी नौकरी। –

+2

मेरे पास यूटीएफ -16 एक 'बीसीपी' एमएसएसक्यूएल डंप से आ रहा है जिसमें वास्तव में नल चरित्र है। बस मस्ती के लिए मैंने एक वैकल्पिक के रूप में स्नोमैन चरित्र (☃) चुना। :) –

+0

यह '" \ x00 "' चाल सुंदर ढंग से काम करता है :-) – Avishai

संबंधित मुद्दे