2011-08-16 9 views
9

मुझे पता है कि कैसे मैं अपने सीएसवी फ़ाइल की एन्कोडिंग को बदल सकते हैं जब मैं इसे आयात और उसे पार्स चाहते हैं।रेल में सीएसवी पार्स दौरान एन्कोडिंग बदलने के लिए

csv = CSV.parse(output, :headers => true, :col_sep => ";") 
csv.each do |row| 
    row = row.to_hash.with_indifferent_access 
    insert_data_method(row) 
end 

जब मैं अपने फ़ाइल को पढ़ने, मैं इस त्रुटि मिलती है:

Encoding::CompatibilityError in FileImportingController#load_file 
incompatible character encodings: ASCII-8BIT and UTF-8 

मैं row.force_encoding('utf-8') के बारे में पढ़ा है, लेकिन यह काम नहीं करता:

NoMethodError in FileImportingController#load_file 
undefined method `force_encoding' for #<ActiveSupport::HashWithIndifferentAccess:0x2905ad0> 

धन्यवाद मैं इस कोड है।

+0

इसके बजाय यह एक अलग एन्कोडिंग को परिवर्तित करने की, होगा संकेतों का एक कदम जोड़ना और अलग फाइलों को आउटपुट करना संभव है? उदाहरण के लिए, कुछ हिस्सों में यूटीएफ -8 को एन्कोड किया गया है लेकिन यूटीएफ -16LE दूसरों में है। जब तक हेडर समान होते हैं, तब तक फ़ाइल को filename_utf8.txt पर फ़ाइल करें और दूसरा filename_utf16le.txt पर आउटपुट करें। इस तरह से एन्कोडिंग को मजबूर नहीं करना संभव हो सकता है। – Tyler

उत्तर

3

force_encoding एक स्ट्रिंग पर चलाया जा करने के लिए है, लेकिन ऐसा लगता है कि आप एक हैश पर कॉल कर रहे हैं। आप कह सकते हैं:

output.force_encoding('utf-8') 
csv = CSV.parse(output, :headers => true, :col_sep => ";") 
... 
+0

मैंने अभी कोशिश की। 'ArgumentError FileImportingController में # load_file' ' अवैध बाइट में UTF-8' – TW147

+0

इस बजाय चल कोशिश अनुक्रम:: 'utf-8', उत्पादन Iconv.conv ('utf-8 // ध्यान न दें', मैं इस त्रुटि मिलती है) –

+0

दुर्भाग्य से, मुझे लगता है कि त्रुटि मिलती है: 'FileImportingController में एन्कोडिंग :: CompatibilityError # load_file' ' असंगत वर्ण एन्कोडिंग: ASCII-8bit और UTF-8' – TW147

14

मुझे आईएसओ -885 9 -1 में एन्कोडेड सीएसवी फाइलें पढ़नी पड़ीं। प्रलेखित कर रही

CSV.foreach(filename, encoding:'iso-8859-1:utf-8', col_sep: ';', headers: true) do |row| 

अपवाद

ArgumentError: invalid byte sequence in UTF-8 
    from csv.rb:2027:in '=~' 
    from csv.rb:2027:in 'init_separators' 
    from csv.rb:1570:in 'initialize' 
    from csv.rb:1335:in 'new' 
    from csv.rb:1335:in 'open' 
    from csv.rb:1201:in 'foreach' 

तो मैं फ़ाइल को पढ़ने और यह UTF-8 में परिवर्तित करने, जबकि पढ़ने तो स्ट्रिंग पार्स करने समाप्त हो गया फेंक दिया:

CSV.parse(File.open(filename, 'r:iso-8859-1:utf-8'){|f| f.read}, col_sep: ';', headers: true, header_converters: :symbol) do |row| 
    pp row 
end 
0

अरे मैंने जो कुछ किया है उसके बारे में मैंने थोड़ा blog post लिखा है, लेकिन यह पहले से पोस्ट किए गए पहले की तुलना में थोड़ा अधिक वर्बोज़ है। किसी भी कारण से, मैं उन समाधानों को काम करने के लिए नहीं मिला और ऐसा हुआ।

यह सार है कि मैं बस की जगह है (या मेरे मामले में, निकालने के लिए) मेरी फाइल में अमान्य/अपरिभाषित पात्रों तो यह फिर से लिखने। मैंने फ़ाइलों को कन्वर्ट करने के लिए इस विधि का उपयोग किया:

def convert_to_utf8_encoding(original_file) 
    original_string = original_file.read 
    final_string = original_string.encode(invalid: :replace, undef: :replace, replace: '') #If you'd rather invalid characters be replaced with something else, do so here. 
    final_file = Tempfile.new('import') #No need to save a real File 
    final_file.write(final_string) 
    final_file.close #Don't forget me 
    final_file 
end 

आशा है कि इससे मदद मिलती है।

संपादित करें: नहीं गंतव्य एन्कोडिंग यहाँ निर्दिष्ट किया जाता है क्योंकि एनकोड मानता है कि आप अपनी डिफ़ॉल्ट एन्कोडिंग के लिए एन्कोडिंग रहे हैं जो सबसे अधिक रेल अनुप्रयोगों के लिए UTF-8 है (मेरा मानना ​​है कि)

+0

अमान्य और अपरिभाषित वर्णों को हटाने के लिए स्ट्रिंग लेना और 'एन्कोड' का उपयोग करना मेरे लिए क्या काम करता है। बहुत बहुत धन्यवाद! – zwickilton

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