2010-02-19 12 views
6

मैंने अन्य रूबी/एन्कोडिंग संबंधित पोस्टों को देखा है लेकिन यह पता लगाने में सक्षम नहीं है कि निम्नलिखित क्यों काम नहीं कर रहा है। शायद इसलिए कि मैं घना हूँ, लेकिन यहां स्थिति है।रूबी स्ट्रिंग एन्कोडिंग समस्या

विंडोज़ पर रूबी 1.9 का उपयोग करना। मेरे पास सीएसवी फाइलों का एक सेट है जिसे प्रत्येक पंक्ति के अंत में जोड़े गए कुछ डेटा की आवश्यकता है। जब भी मैं अपनी स्क्रिप्ट चलाता हूं, तो संलग्न वर्ण गिबिश होते हैं। इनपुट टेक्स्ट आईबीएम 437 एन्कोडिंग प्रतीत होता है, जबकि मेरी स्ट्रिंग जो मैं जोड़ रहा हूं वह यूएस-एएससीआईआई के रूप में शुरू होती है। इनपुट स्ट्रिंग्स या एपेंड स्ट्रिंग पर एन्कोडिंग को मजबूर करने के संबंध में मैंने कुछ भी नहीं किया है परिणामस्वरूप आउटपुट को बदलना प्रतीत होता है। मैं उलझन में हूं। वर्तमान एन्कोडिंग संस्करण बस आखिरी बार मैंने कोशिश की है।

def append_salesperson(txt, salesperson) 
    if txt.length > 2 
    return txt.chomp.force_encoding('US-ASCII') + %(, "", "", "#{salesperson}") 
    end 
end 

salespeople = Hash[ 
    "fname", "Record Manager"] 

outfile = File.open("ActData.csv", "w:US-ASCII") 

salespeople.each do | filename, recordManager | 
    infile = File.open("#{filename}.txt") 
    infile.each do |line| 
    outfile.puts append_salesperson(line, recordManager) 
    end 
    infile.close 
end 
outfile.close 
+0

क्या आप अपनी स्क्रिप्ट में एन्कोडिंग जादू टिप्पणी का उपयोग कर रहे हैं? – kch

उत्तर

0

शायद (, "", "", "# {salesperson.force_encoding ('कुछ')}") txt.chomp.force_encoding ('US-ASCII') +%

?

+0

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

+2

मैं शायद इसके बारे में एक "छोटा" पुनरुत्पादित परीक्षण केस और पिंग रूबी कोर खोजने की कोशिश करता हूं। – rogerdpack

+0

'chcp' कमांड का उपयोग करके, आप रूबी स्क्रिप्ट लॉन्च करने से पहले कंसोल से सक्रिय कोड पेज को बदलने का भी प्रयास कर सकते हैं (उदा।' Chcp 65001' इसे यूटीएफ -8 पर सेट करेगा)। दुर्भाग्यवश, आप इसे यूटीएफ -16 पर सेट नहीं कर सकते हैं, जो मुझे लगता है कि आपकी फाइलें हैं। – ewall

0

ऐसा लगता है जैसे सीएसवी डेटा यूटीएफ -16 के रूप में आ रहा है ... इसलिए रखता है प्रिंट करने योग्य चरित्र (पहला बाइट) प्लस एक स्पेस (दूसरा बाइट) के रूप में दिखाता है।

क्या आपने .force_encoding(Encoding::UTF-16LE) या .force_encoding(Encoding::UTF-16BE) के साथ अपने संलग्न डेटा को एन्कोड करने का प्रयास किया है?

1

आपके प्रश्न से संबंधित एक छोटा सा नोट यह है कि आपके पास अपना सीएसवी डेटा %(, "", "", "#{salesperson}") है। यहां आपके डबल कोट्स से पहले एक स्पेस चार है। यदि इस पाठ में अल्पविराम है तो यह #{salesperson} को कई फ़ील्ड के रूप में व्याख्या करने का कारण बन सकता है। इसे ठीक करने के लिए अल्पविराम और डबल कोट्स के बीच सफेद स्थान नहीं हो सकता है। उदाहरण: "this is a field","Last, First","and so on"। एक्सेल में देखी जाने वाली रिपोर्ट बनाने के दौरान मैं एक छोटा गॉचाचा चलाता हूं।

Common Format and MIME Type for Comma-Separated Values (CSV) Files में वे संदर्भ के लिए एक सीएसवी फ़ाइल के व्याकरण का वर्णन करते हैं।

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