2012-09-02 10 views
8

मेरे ऐप (रेल 3.0.5, रूबी 1.8.7) में, मैंने फाइल से सीएसवी डेटा आयात करने के लिए एक आयात उपकरण बनाया है।रेल 3, आयात से पहले सीएसवी फ़ाइल एन्कोडिंग की जांच करें

समस्या: मैंने अपने उपयोगकर्ताओं से यूटीएफ -8 एन्कोडिंग में एक्सेल से सीएसवी फ़ाइल निर्यात करने के लिए कहा लेकिन वे इसे अधिकतर समय नहीं करते हैं।

आयात करने से पहले मैं यह सत्यापित कैसे कर सकता हूं कि फ़ाइल यूटीएफ -8 है या नहीं? अन्यथा आयात चल जाएगा लेकिन अजीब परिणाम देगा। मैं आयात करने के लिए FasterCSV का उपयोग करें।

बुरा CSV फ़ाइल की उदाहरण:

;VallÈe du RhÙne;CÙte Rotie; 

धन्यवाद।

उत्तर

22

आप रूबी के लिए एक चरित्र एन्कोडिंग डिटेक्टिंग लाइब्रेरी चार्लॉक होम्स का उपयोग कर सकते हैं।

https://github.com/brianmario/charlock_holmes

इसका इस्तेमाल करने के लिए आपको सिर्फ फ़ाइल को पढ़ने, और detect विधि का उपयोग करें।

contents = File.read('test.xml') 
detection = CharlockHolmes::EncodingDetector.detect(contents) 
# => {:encoding => 'UTF-8', :confidence => 100, :type => :text} 

तुम भी UTF-8 में एन्कोडिंग परिवर्तित कर सकते हैं अगर यह सही स्वरूप में नहीं है:

utf8_encoded_content = CharlockHolmes::Converter.convert contents, detection[:encoding], 'UTF-8' 

यह इसे फिर से अपलोड करने से पहले यह खुद को क्या करने वाले से उन बचत होती है।

+0

धन्यवाद, मैं यह कोशिश करेंगे। –

+0

यह पूरी तरह से काम कर रहा है! एक बड़ा धन्यवाद। –

6

1.9 के लिए यह स्पष्ट है, तो आप सिर्फ UTF8 उम्मीद करने के लिए कह और अगर यह नहीं है यह एक त्रुटि बढ़ा देंगे:

begin 
    lines = CSV.read('bad.csv', :encoding => 'utf-8') 
rescue ArgumentError 
    puts "My users don't listen to me!" 
end 
+0

यह अच्छा लगता है। 1.8.7 के लिए कुछ नहीं? ;) –

+0

मेरे लिए नहीं, लेकिन स्ट्रिंग एन्कोडिंग 1.8 और 1.9 के बीच सबसे बड़ा अंतर है, इसलिए ऐसा लगता है कि 1.9 वही है जो आप चाहते हैं। – pguardiario

+0

यदि आप किसी चर में file_field_tag ​​से सीधे फ़ाइल प्राप्त कर रहे हैं, तो मान लें कि वेरिएबल @csv_file है, उस स्थिति में {lines = CSV.read ('bad.csv',: एन्कोडिंग => 'utf-8') के बजाय } {line = CSV.read (@ csv_file.tempfile, एन्कोडिंग: 'utf-8')} –