2015-05-21 6 views
5

है, मैं CSV फ़ाइलों को उत्पन्न कर रहा हूं जिन्हें एक्सेल में प्रकाशित होने के बाद खोला जाना चाहिए और समीक्षा की जानी चाहिए। ऐसा लगता है कि एक्सेल को यूटीएफ -8 की तुलना में एक अलग एन्कोडिंग की आवश्यकता है।रूबी: सीएसवी फाइलें कैसे उत्पन्न करें जिनमें एक्सेल-फ्रेंडली एन्कोडिंग

csv_config = {col_sep: ";", 
       row_sep: "\n", 
       encoding: Encoding::UTF_8 
      } 

csv_string = CSV.generate(csv_config) do |csv| 
    csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] 
end 

जब Excel में इस खोलने, विशेष वर्ण ठीक से प्रदर्शित नहीं किया जा रहा है:

Text a Text b Text æ Text ø Text å 

किसी भी विचार कैसे उचित इनकोडिंग को सुनिश्चित करने के लिए

यहाँ मेरी config और पीढ़ी कोड है?

+0

अपनी रूबी फ़ाइल की पहली पंक्ति के रूप में '# एन्कोडिंग: यूटीएफ -8' डालने का प्रयास करें (दूसरा यदि आपके पास हैश-बैंग लाइन है, '#!/Usr/bin/env ruby')। मेरा मानना ​​है कि आप यूटीएफ -8 में * लेखन * कर रहे हैं, लेकिन रुबी स्रोत फ़ाइल को यूएस_एएससीआईआई के रूप में एन्कोड किया गया है। (रुबी 2.0+ के साथ, यूटीएफ -8 में स्रोत एन्कोडिंग डिफ़ॉल्ट) – Amadan

+0

मैं 'रूबी 2.0.0p247 (2013-06-27 संशोधन 41674) [x86_64-darwin12.4.0] का उपयोग कर रहा हूं, इसलिए मुझे लगता है कि मेरा इंस्टॉलेशन पहले से ही है यूटीएफ -8 के लिए डिफ़ॉल्ट। – ChristofferJoergensen

+2

रूबी के साथ कोई अनुभव नहीं। लेकिन एक्सेल अर्धविराम सीमवी फाइलों को खोल सकता है जो यूटीएफ -8 एन्कोडेड हैं। लेकिन फ़ाइल की शुरुआत में बीओएम होना चाहिए। और क्या अर्धविराम का उपयोग डिलीमीटर के रूप में किया जा सकता है लोकेल निर्भर है। तो सबसे अच्छा तरीका टैबलेट सीमांकित सीएसवी और उन यूटीएफ -16LE एन्कोडेड का उपयोग करना है। यह सबसे लोकल स्वतंत्र होना चाहिए। –

उत्तर

7

आप निम्नलिखित के रूप में ISO-8859-1 को एन्कोडिंग स्विच करना चाहिए: अपने संदर्भ के लिए

CSV.generate(encoding: 'ISO-8859-1') { |csv| csv << ["Text á", "Text é", "Text æ"] } 

, तो आप ऐसा कर सकते हैं:

config = { 
    col_sep: ';', 
    row_sep: ';', 
    encoding: 'ISO-8859-1' 
} 

CSV.generate(config) { |csv| csv << ["Text á", "Text é", "Text æ"] } 

मैं एक ही मुद्दा है और उस एन्कोडिंग तय किया था।

+0

उपर्युक्त उत्तर मेरे लिए काम करता था, लेकिन केवल 'col_sep' और 'row_sep' तर्कों को हटा दिए जाने के बाद ही। बस 'एन्कोडिंग:' आईएसओ -885 9 -1 '' मुझे बस इतना जरूरी था।संदर्भ के लिए, मेरे पास जो विशिष्ट समस्या थी, वह 'Ã' ' –

+0

गुड कैच ग्रेग के रूप में दिखाई देने वाले वर्ण थे, मैं संदर्भ के बिना उदाहरण अपडेट करूंगा। – joaofraga

5

@ जोआओफ्रागा से शीर्ष मतदान का जवाब मेरे लिए काम करता था, लेकिन मुझे एक वैकल्पिक समाधान मिला जो काम भी करता था - आईएसओ -8859-1 ट्रांसकोडिंग के लिए कोई यूटीएफ -8 नहीं था।

जो मैंने पढ़ा है, एक्सेल, वास्तव में यूटीएफ -8 को संभाल सकता है, लेकिन किसी कारण से, यह डिफ़ॉल्ट रूप से इसे पहचान नहीं करता है। लेकिन अगर आप सीएसवी डेटा की शुरुआत में बीओएम जोड़ें, तो ऐसा लगता है कि एक्सेल को यह एहसास हुआ कि फ़ाइल यूटीएफ -8 है।

तो, अगर आप ऐसा तरह एक सीएसवी है:

csv_string = CSV.generate(csv_config) do |csv| 
    csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] 
end 

सिर्फ इसलिए की तरह एक बीओएम बाइट जोड़ें:

"\uFEFF" + csv_string 

मेरे मामले में, मेरा नियंत्रक एक फ़ाइल के रूप सीएसवी भेज रहा है,

def show 
    respond_to do |format| 
    format.csv do 
     # add BOM to force Excel to realise this file is encoded in UTF-8, so it respects special characters 
     send_data "\uFEFF" + csv_string, type: :csv, filename: "csv.csv" 
    end 
    end 
end 

मैं कि UTF-8 में ही ध्यान देना चाहिए नहीं अनुरोध: तो यह मेरा नियंत्रक कैसा दिखाई देता है है uire या सभी पर बीओएम की सिफारिश करें, लेकिन जैसा कि मैंने उल्लेख किया है, इस मामले में इसे जोड़ने से एक्सेल को यह समझने में लगा कि फाइल वास्तव में यूटीएफ -8 थी।

+0

अच्छी चाल ऐसा लगता है जैसे यह एक्सेल पर काम करता है –

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