आर

2011-09-13 8 views
8

में .csv में UTF-8 BOM निर्यात करें। मैं एक MySQL डेटाबेस से आरजेडीबीसी के माध्यम से एक फ़ाइल पढ़ रहा हूं और यह आर में सभी अक्षरों को सही ढंग से प्रदर्शित करता है (उदाहरण के लिए, נווה שאנן)। हालांकि, write.csv और fileEncoding = "UTF-8" का उपयोग करके इसे निर्यात करते समय भी आउटपुट <U+0436>.<U+043A>. <U+041B><U+043E><U+0437><U+0435><U+043D><U+0435><U+0446> (इस मामले में यह ऊपर की स्ट्रिंग नहीं है लेकिन बल्गेरियाई एक है) बल्गेरियाई, हिब्रू, चीनी और इसी तरह के लिए दिखता है। अन्य विशेष पात्र जैसे ã, ç आदि ठीक काम करते हैं।आर

मुझे लगता है यह UTF-8 बीओएम की वजह से है, लेकिन मैं शुद्ध

मेरे ओएस पर एक समाधान एक जर्मन Windows7 है नहीं मिला।

संपादित करें: मैं

con<-file("file.csv",encoding="UTF-8") 
write.csv(x,con,row.names=FALSE) 

और (AFAIK) बराबर write.csv(x, file="file.csv",fileEncoding="UTF-8",row.names=FALSE) की कोशिश की।

+2

क्या आप कह रहे हैं कि जब आप निर्यात की गई फ़ाइल खोलते हैं, तो आप "ж" के बजाय "U + 0436" देखते हैं? यदि ऐसा है तो कोई बीओएम मुद्दा नहीं है, तो यूनिकोड कोड बिंदुओं का एक मुद्दा यूटीएफ एन्कोडिंग में एन्कोड नहीं किया जा रहा है, लेकिन कोड पॉइंट के रूप में आउटपुट। शायद हमें कुछ कोड दिखाएं कि आप फ़ाइल को कैसे निर्यात कर रहे हैं? – deceze

+0

मैंने इस जानकारी को जोड़ा कि मैंने फ़ाइल को कैसे निर्यात किया। और हाँ, मैं "" की बजाय "ж" –

+1

फ़ाइल में "" देखकर संदिग्ध है (इसका अर्थ यह भी हो सकता है कि उन पात्रों को वास्तव में उस फ़ाइल में रेखांकित किया गया है या आपका संपादक उन्हें प्रदर्शित नहीं कर सकता है)। आप या तो हमें फाइल में "ж" लिख सकते हैं और हमें जेनरेट की गई सभी पात्रों के हेक्स-वैल्यू बता सकते हैं (इसे हेक्स-एडिटर में खोलें); या हमें अपनी समस्या को पुन: उत्पन्न करने के लिए कोड दें (बेशक हमारे पास आपका डीबी नहीं है, इसलिए नमूना डेटा के साथ एक वेक्टर बनाएं)। –

उत्तर

5

सहायता पृष्ठ पर Encoding (help("Encoding")) पर आप विशेष एन्कोडिंग - bytes के बारे में पढ़ सकते हैं।

इस मैं से csv फ़ाइल उत्पन्न करने में सक्षम था का उपयोग करना: factor और character बीच अंतर के बारे

v <- "נווה שאנן" 
X <- data.frame(v1=rep(v,3), v2=LETTERS[1:3], v3=0, stringsAsFactors=FALSE) 

Encoding(X$v1) <- "bytes" 
write.csv(X, "test.csv", row.names=FALSE) 

लें देखभाल। निम्नलिखित काम करना चाहिए:

id_characters <- which(sapply(X, 
    function(x) is.character(x) && Encoding(x)=="UTF-8")) 
for (i in id_characters) Encoding(X[[i]]) <- "bytes" 

id_factors <- which(sapply(X, 
    function(x) is.factor(x) && Encoding(levels(x))=="UTF-8")) 
for (i in id_factors) Encoding(levels(X[[i]])) <- "bytes" 

write.csv(X, "test.csv", row.names=FALSE) 
2

स्वीकार किए जाते हैं जवाब एक समान आवेदन में मुझे मदद नहीं की (Windows में आर 3.1 है, जबकि मैं Excel में फ़ाइल खोलने का प्रयास किया गया था)। वैसे भी, फ़ाइल प्रलेखन के इस हिस्से के आधार पर:

एक बीओएम की आवश्यकता है तो (यह नहीं है अनुशंसित) जब लिखित यह स्पष्ट रूप से लिखा जाना चाहिए, उदा

: writeChar ("\ ufeff", चोर, EOS = शून्य) या writeBin (as.raw (ग (0xef, 0xbb, 0xbf)), binary_con) द्वारा

मैं निम्नलिखित तरीके को साथ आया था

write.csv.utf8.BOM <- function(df, filename) 
{ 
    con <- file(filename, "w") 
    tryCatch({ 
    for (i in 1:ncol(df)) 
     df[,i] = iconv(df[,i], to = "UTF-8") 
    writeChar(iconv("\ufeff", to = "UTF-8"), con, eos = NULL) 
    write.csv(df, file = con) 
    },finally = {close(con)}) 
} 

ध्यान दें कि df data.frame और फ़ाइल नाम है csv फ़ाइल के लिए पथ है।