2015-04-30 20 views
7

listeden data.frame için dönüştürürken kaybolur, Windows 7 64-bit RSTudio 0.98.1103 ile R 3.2.0 kullanıyorum. Bilgisayarımın Windows "bölgesel ve dil ayarları", İngilizce'dir (ABD).utf-8 karakter R

Herhangi bir nedenle aşağıdaki kod, utf-8 kodlamasında bir XML dosyasını okuduğumda "Koryčany nad přehradou" metninde "c" ve "r" ile Çek karakterlerimi "č" ve "ř" değiştirir. Web, XML dosyasını bir listeye ayırın ve listeyi bir data.frame dosyasına dönüştürün.

library(XML) 
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken=" 
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE)) 
infoList <- xmlToList(doc[[2]][[1]]) 
siteName <- infoList$siteName 

#this still displays correctly "Koryčany nad přehradou" 
print(siteName) 

#make a data.frame from the list item. I suspect here is the problem. 
df <- data.frame(name=siteName, id=1) 

#now the Czech characters are lost. I see only "Korycany nad prehradou" 
View(df) 

write.csv(df,"test.csv") 
#the test.csv file also contains "Korycany nad prehradou" 
#instead of "Koryčany nad přehradou" 

Sorun nedir? Data.frame'ımı tüm utf-8 özel karakterleriyle doğru şekilde göstermesini ve "č" ve "ř" Çek karakterlerini kaybetmeden .csv dosyasını kaydetmesini nasıl sağlayabilirim?

+1

Bulunduğunuz yeri CZ olarak değiştirebilir ve bu şekilde düzeltebilir misiniz? Bana – thelatemail

+0

kısmi bir çözüm olarak: Sys.setLocale (yerel = "Çek") 'R. Koryčany nad přehradou'' olarak doğru data.frame görüntülemek için 'Ancak şimdi' write.csv (df kullandığınızda, "Test .csv ")' ve test.csv'yi Excel veya Notepad'de açın, metin şu şekilde görünecektir: 'Koryèany nad pøehradou' csv dosyasında. Sorunu çözmenin tek yolu, csv dosyasını Notepad ++ 'da açmak ve dosyanın Windows-1250'ye kodlamasını değiştirmekti. – jirikadlec2

+0

Bunun tam olarak bir kopyası olduğuna ikna olmadım. Diğer bir soru, bir veri sorununa odaklanıyor gibi gözüküyor, ki bu aslında verinin depolanmasını değiştiriyor gibi görünüyor - önceki iki kopya - http://stackoverflow.com/questions/17715956/why-do-some-unicode-characters -düzenlemede-matrisler-ama-olmayan-veri-kareler-in-r? lq = 1 – thelatemail

cevap

4

Bu mükemmel bir yanıt değil, ancak aşağıdaki geçici çözüm benim için sorunu çözdü. Ben davranış veya R anlamak ve örnek yapmaya çalıştım benim R komut Windows ve Linux platformu üzerinde her ikisi de aynı sonuçlar üretir, böylece:

(1) internetten UTF-8 XML verilerini alın

library(XML) 
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken=" 
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE)) 
infoList <- xmlToList(doc[[2]][[1]]) 
siteName <- infoList$siteName 

(2) internetten metni yazdır: Kodlama R konsolunda UTF-8, ekran olan Çek ve Windows üzerinde İngilizce yerel ikisini de kullanarak da doğrudur:

> Sys.getlocale(category="LC_CTYPE") 
[1] "English_United States.1252" 
> print(siteName) 
[1] "Koryčany nad přehradou" 
> Encoding(siteName) 
[1] "UTF-8" 
> 

(3) Bir data.frame oluşturmayı ve görüntülemeyi deneyin. Bunun bir sorunu var. yanlış hem RStudio görünümde ve konsolunda data.frame görüntüler:

df <- data.frame(name=siteName, id=1) 
df 
        name id 
1 Korycany nad prehradou 1 

(4) yerine, bir matris kullanın deneyin. Şaşırtıcı bir şekilde matris R konsolunda doğru şekilde görüntülenir.

m <- as.matrix(df) 
View(m) #this shows incorrectly in RStudio 
m  #however, this shows correctly in the R console. 
    name      id 
[1,] "Koryčany nad přehradou" "1" 

(5) Yerel ayarı değiştirin. Windows'daysam, yerel ayarı Çek'e ayarlayın. Unix veya Mac'deysem, yerel ayarı UTF-8 olarak ayarlayın. Not: RStudio komut dosyasını çalıştırdığımda bu bazı sorunlar vardır, görünüşe göre RStudio her zaman hemen Sys.setlocale komutuna tepki vermiyor.

(7) Verileri bir metin dosyasına yazın. ÖNEMLİ: write.csv kullanmayın, bunun yerine write.table kullanın. Yerel bilgisayarım İngilizce Windows'umda Czech olduğunda, write.table numaralı telefondan fileEncoding="UTF-8"'u kullanmalıyım. Şimdi metin dosyası, notepad ++ ve ayrıca Excel'de doğru şekilde ortaya çıkıyor.

write.table(m, "test-czech-utf8.txt", sep="\t", fileEncoding="UTF-8") 

(8) tekrar orijinal

için yerel ayarlama
Sys.setlocale("LC_CTYPE", original.locale) 

(9) geri R. NOT içine metin dosyasını okumak için deneyin: dosyayı okudum, ben encoding ayarlamak zorunda parametre (NOT fileEncoding!). Dosyadan oku data.frame ekran hala yanlıştır, ama bu benim data.frame bir matrix dönüştürmek Çek UTF-8 karakter korunur:

data.from.file <- read.table("test-czech-utf8.txt", sep="\t", encoding="UTF-8") 
#the data.frame still has the display problem, "č" and "ř" get "lost" 
> data.from.file 
        name id 
1 Korycany nad prehradou 1 

#see if a matrix displays correctly: YES it does! 
matrix.from.file <- as.matrix(data.from.file) 
> matrix.from.file 
    name      id 
1 "Koryčany nad přehradou" "1" 

Yani öğrenilen ders ı dönüştürmek için ihtiyaç vardır Benim data.frame için bir matrix, benim veriyi bir dosyaya Çek karakterleriyle yazmadan önce yerel ayarımı Czech (Windows'ta) veya UTF-8 (Mac ve Linux'ta) olarak ayarlayın.Sonra dosyayı yazdığımda, fileEncoding'un UTF-8 olarak ayarlanması gerektiğinden emin olmalıyım. Diğer yandan dosyayı daha sonra okuduğumda, İngilizce yerel ayarında çalışmaya devam edebilirim, ancak read.table'da encoding="UTF-8"'u ayarlamalıyım.

Daha iyi bir çözümü varsa, önerilerinizi kabul ederim.

İlgili konular