आर

2013-11-09 6 views
18

से यूटीएफ -8 फाइलें लिखें, जबकि आर यूनिकोड वर्णों को आंतरिक रूप से आंतरिक रूप से संभालने लगता है, मैं ऐसे यूटीएफ -8 यूनिकोड वर्णों के साथ आर में डेटा फ्रेम आउटपुट करने में सक्षम नहीं हूं। क्या इसे मजबूर करने का कोई तरीका है?आर

data.frame(c("hīersumian","ǣmettigan"))->test 
write.table(test,"test.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8") 

उत्पादन पाठ फ़ाइल में लिखा है:

hiersumian <U+01E3>mettigan

मैं एक Windows वातावरण (विंडोज 7) में आर संस्करण 3.0.2 का उपयोग कर रहा हूँ।

संपादित


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

read.table("myinputfile.txt",encoding="UTF-8")->myinputfile 
myinputfile[1,1] 
write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8") 
read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile 
myoutputfile[1,1] 

कंसोल आउटपुट:

> read.table("myinputfile.txt",encoding="UTF-8")->myinputfile 
> myinputfile[1,1] 
[1] hīersumian 
Levels: hīersumian ǣmettigan 
> write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8") 
> read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile 
> myoutputfile[1,1] 
[1] <U+FEFF>hiersumian 
Levels: <U+01E3>mettigan <U+FEFF>hiersumian 
> 
+0

काम करता है (उबंटू 12.04 पर आर-डेवेल) टर्मिनल, vi, या emacs में फ़ाइल को देखते समय। –

+0

@ बेनबॉल्कर क्या इसका मतलब यह है कि यह समस्या आर के विंडोज संस्करण के लिए विशिष्ट है? – Sverre

+1

स्पष्टीकरण के लिए: यह एक विंडोज-विशिष्ट समस्या है। ओएस एक्स पर परिणाम सही रूप से सही है। 'test.txt: यूटीएफ -8 यूनिकोड टेक्स्ट 'के साथ' test test.txt' जवाब '। हेक्सडम्प सही बाइट दिखाता है। हालांकि अच्छी तरह से लिखित सवाल। –

उत्तर

7

यह "जवाब" स्पष्ट वहाँ कुछ अजीब पर्दे के पीछे चल रहा है कि करने के उद्देश्य से नहीं बल्कि कार्य करता है:

"hīersumian" भी नहीं है यह डेटा फ्रेम में लगता है। "आई" -सिंबोल सभी मामलों में "i" में परिवर्तित हो गया है।

options("encoding" = "native.enc") 
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F) 
t1 
#    a 
# 1 hiersumian 

options("encoding" = "UTF-8") 
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F) 
t1 
#    a 
# 1 hiersumian 

options("encoding" = "UTF-16") 
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F) 
t1 
#    a 
# 1 hiersumian 

निम्नलिखित अनुक्रम सफलतापूर्वक पाठ फ़ाइल में "ǣmettigan" लिखते हैं:

t2 <- data.frame(a = c("ǣmettigan"), stringsAsFactors=F) 

getOption("encoding") 
# [1] "native.enc" 

Encoding(t2[,"a"]) <- "UTF-16" 

write.table(t2,"test.txt",row.names=F,col.names=F,quote=F) 

enter image description here

यह "एन्कोडिंग" के साथ काम करने के रूप में "UTF-8" या "नहीं जा रहा है यूटीएफ -16 "और" फाइल एन्कोडिंग "को भी निर्दिष्ट करने से कोई दोष या कोई आउटपुट नहीं होगा।

कुछ हद तक निराशाजनक है क्योंकि मैं अब तक सभी यूनिकोड मुद्दों को ठीक करने में कामयाब रहा हूं।

+0

जबकि 'write.table' अभी भी विफल हो रहा है मेरी मशीन (उबंटू), '' हिर्सुमियन 'का स्वचालित रूपांतरण अब मेरे वर्तमान संस्करण आर (3.3.2) में एक मुद्दा नहीं प्रतीत होता है – MichaelChirico

1

मैं कुछ ओएस विशेष गायब हो सकता है, लेकिन data.table (या इसे आर internals के लिए एक अद्यतन के बाद से इस सवाल का मूल रूप से उत्पन्न किया गया था शायद अधिक होने की संभावना) इस के साथ कोई समस्या नहीं है करने के लिए प्रकट होता है: मेरे लिए

t1 = data.table(a = c("hīersumian", "ǣmettigan")) 
tmp = tempfile() 
fwrite(t1, tmp) 
system(paste('cat', tmp)) 
# a 
# hīersumian 
# ǣmettigan 
fread(tmp) 
#    a 
# 1: hīersumian 
# 2: ǣmettigan