2015-04-30 7 views
7

Używam R 3.2.0 z RStudio 0.98.1103 na Windows 7 64-bit. Windows "ustawienia regionalne i językowe" mojego komputera to angielski (Stany Zjednoczone).utf-8 znaków gubią się podczas konwersji z listy do data.frame w R

Z jakiegoś powodu poniższy kod zastępuje moje czeskie znaki "č" i "ř" przez "c" i "r" w tekście "Koryčany nad přehradou", gdy czytam plik XML w kodowaniu utf-8 z w Internecie, sparsuj plik XML do listy i przekonwertuj listę do data.frame.

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" 

Na czym polega problem? Jak sprawić, by R wyświetlał poprawnie moje dane.frame ze wszystkimi znakami specjalnymi UTF-8 i zapisywał plik .csv bez utraty znaków "č" i "ř" w języku czeskim?

+1

Czy możesz zmienić swoje ustawienia regionalne na CZ i naprawić je w ten sposób? – thelatemail

+0

Częściowe obejście dla mnie to: 'Sys.setLocale (locale =" Czech ")' wyświetla poprawnie dane.frame jako 'Koryčany nad přehradou' w R. Ale teraz kiedy używam' write.csv (df, "test .csv ")' i otwórz plik test.csv w Excelu lub Notatniku, tekst pojawia się jako: 'Koryčany nad pøehradou' w pliku csv. Jedynym sposobem rozwiązania problemu było otwarcie pliku csv w Notepad ++ i zmiana kodowania pliku na Windows-1250. – jirikadlec2

+0

Nie jestem przekonany, że to dokładny duplikat. Inne pytanie wydaje się skupiać na problemie wyświetlania, gdzie wydaje się, że to faktycznie zmienia przechowywanie danych - poprzedni duplikat - http://stackoverflow.com/questions/17715956/why-do-some-unicode-characters -display-in-matrix-ale-nie-danych-frame-in-r? lq = 1 – thelatemail

Odpowiedz

4

To nie jest idealna odpowiedź, ale następujące rozwiązanie rozwiązało problem. Starałem się zrozumieć zachowanie lub R, i sprawiają, że przykład tak, że mój skrypt R daje te same wyniki zarówno na Windows i na platformie Linux:

(1) Pobierz dane XML w UTF-8 z Internetu

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) wydrukować tekst z internetu: Kodowanie UTF-8, wyświetlacz w konsoli R jest również prawidłowe przy użyciu zarówno czeskiej i ustawienia regionalne angielskiego na oknach:

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

(3) Spróbuj utworzyć i wyświetlić dane.frame. To ma problem. W data.frame nieprawidłowo wyświetla zarówno w widoku RStudio i w konsoli:

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

(4) Spróbuj użyć zamiast matrycy. Zaskakująco macierz wyświetla się poprawnie w konsoli R.

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) Zmień ustawienia regionalne. Jeśli jestem w systemie Windows, ustaw język na Czeski. Jeśli korzystam z systemu Unix lub Mac, ustaw locale na UTF-8. UWAGA: Ma to pewne problemy, gdy uruchamiam skrypt w RStudio, najwyraźniej RStudio nie zawsze reaguje natychmiast na polecenie Sys.setlocale.

#remember the original locale. 
original.locale <- Sys.getlocale(category="LC_CTYPE") 

#for Windows set locale to Czech. Otherwise set locale to UTF-8 
new.locale <- ifelse(.Platform$OS.type=="windows", "Czech_Czech Republic.1250", "en_US.UTF-8") 
Sys.setlocale("LC_CTYPE", new.locale) 

(7) Zapisz dane w pliku tekstowym. WAŻNE: nie używaj write.csv, ale zamiast tego użyj write.table. Kiedy mój język ustawiony jest na Czech na moim angielskim Windows, muszę użyć fileEncoding="UTF-8" w write.table. Teraz plik tekstowy wyświetla się poprawnie w Notatniku ++, a także w Excelu.

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

(8) Ustaw locale z powrotem do pierwotnego

Sys.setlocale("LC_CTYPE", original.locale) 

(9) Spróbuj odczytać plik tekstowy z powrotem do R. UWAGA: Jeśli czytam plik, musiałem ustawić encoding parametr (NOT fileEncoding!). Wyświetlacz o data.frame odczytu z pliku jest nadal nieprawidłowa, ale kiedy mój data.frame konwertować do matrix Czech UTF-8 znaków są zachowane:

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" 

Więc lekcja jest to, że trzeba konwertować my data.frame do , ustaw moje locale na Czech (w systemie Windows) lub na UTF-8 (na Mac i Linux), zanim napiszę moje dane z czeskimi znakami do pliku.Kiedy piszę ten plik, muszę się upewnić, że fileEncoding musi być ustawiony na UTF-8. Z drugiej strony, gdy później przeczytałem plik, mogę dalej pracować w języku angielskim, ale w read.table muszę ustawić encoding="UTF-8".

Jeśli ktoś ma lepsze rozwiązanie, przyjmuję Twoje sugestie.