2013-05-30 14 views
20

Mam pliku .csv, który zawiera następujące dane:nie można odczytać unicode csv do R

"Ա","Բ" 
1,10 
2,20 

nie mogę czytać w R tak, że nazwy kolumn są wyświetlane jak są one w pliku.

d <- read.csv("./Data/1.csv", fileEncoding="UTF-8") 
head(d) 

wywołuje następujące:

> d <- read.csv("./Data/1.csv", fileEncoding="UTF-8") 
Warning messages: 
1: In read.table(file = file, header = header, sep = sep, quote = quote, : 
    invalid input found on input connection './Data/1.csv' 
2: In read.table(file = file, header = header, sep = sep, quote = quote, : 
    incomplete final line found by readTableHeader on './Data/1.csv' 
> head(d) 
[1] X. 
<0 rows> (or 0-length row.names) 

Tymczasem robi to samo bez podania fileencoding produkuje to:

> d <- read.csv("./Data/1.csv") 
> head(d) 
    Ô. Ô² 
1 1 10 
2 2 20 

Kiedy uruchomić "plik" narzędzie, aby dowiedzieć się kodowanie pliku, jest napisane, że jest UTF-8:

Data\1.csv: UTF-8 Unicode text, with CRLF line terminators 

Używam programów RStudio, Windows 7, R w wersji 2.15.2, 32-bitowych.

Z góry dziękuję.

+0

Działa idealnie dla mnie z R 2.15.3 na Linux. (Drugie ostrzeżenie to prawdopodobnie brakujący "enter" w ostatnim wierszu pliku) – Spacedman

+4

Mogę replikować problem. Nigdy nie użyłem tych paramów, ale użycie 'kodowania' zamiast, to znaczy' read.csv (..., encoding = "UTF-8") 'czyta w pliku, ale nagłówek nie jest pokazywany jako litery, ale jako' XUFEFF..U.0531. X.U.0532 "zamiast tego. – eddi

+1

obserwacja: '> a =" Ա "; > a; [1] "Ա" 'działa poprawnie, ale to nie robi:' data.frame (a); # a # 1 ' – eddi

Odpowiedz

0

Próbowałem na dwa sposoby, aby zreplikować twój problem.

skopiowane znaki powyższe pod RStudio, zapisany do pliku CSV z tym kodem:

write.csv(c("Ա","Բ", 
      1,10, 
      2,20), "test.csv") 

df <- read.csv("test.csv") 

To działało w porządku.

Pomyślałem, że może R oszukuje, gdy zapisuję go w pliku CSV z R? Właśnie wkleiłem znaki do pliku tekstowego i zapisałem jako plik CSV. Takie podejście również nie sprawia problemów.

Oto moja informacji sesja:

sessionInfo() 
R version 3.0.1 (2013-05-16) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_CA.UTF-8  LC_NUMERIC=C    LC_TIME=en_CA.UTF-8  
[4] LC_COLLATE=en_CA.UTF-8  LC_MONETARY=en_CA.UTF-8 LC_MESSAGES=en_CA.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     LC_ADDRESS=C    
[10] LC_TELEPHONE=C    LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats4 grid  stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] party_1.0-9  modeltools_0.2-21 strucchange_1.4-7 sandwich_2.2-10 zoo_1.7-10  
[6] GGally_0.4.4  reshape_0.8.4  plyr_1.8   ggplot2_0.9.3.1 

loaded via a namespace (and not attached): 
[1] coin_1.0-23  colorspace_1.2-2 dichromat_2.0-0 digest_0.6.3  
[5] gtable_0.1.2  labeling_0.2  lattice_0.20-23 MASS_7.3-29  
[9] munsell_0.4.2  mvtnorm_0.9-9995 proto_0.3-10  RColorBrewer_1.0-5 
[13] reshape2_1.2.2  scales_0.2.3  splines_3.0.1  stringr_0.6.2 
0

miałem ten sam problem i okazało się, że plik został uszkodzony.

otworzyłem plik z OpenOffice i zapisać go z powrotem za pomocą „UTF-8” Zestaw znaków (trzeba kliknąć Ustawienia filtra pole edycji), a następnie importowane go z read.csv() (bez kodowania lub filencoding opcja) i to działało dobrze.

11

Napisałem dłuższą odpowiedź na ten sam problem tutaj: R on Windows: character encoding hell.

Szybka odpowiedź, używając kodowania parametrów zamiast fileEncoding, należy naprawić swój pierwszy problem. Nie będzie można go odczytać w widoku konsoli lub tabeli w RStudio, ale będzie można go używać w formułach.

d <- read.csv("./Data/1.csv", encoding="UTF-8") 
head(d) 

Po zapisaniu tabeli w UTF-8 pliku:

> test2 <- read.csv("test2.csv", header = FALSE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", encoding = "UTF-8") 
Warning message: 
In read.table(file = file, header = header, sep = sep, quote = quote, : 
    incomplete final line found by readTableHeader on 'test2.csv' 

Daje wam jak to wygląda w konsoli i widok RStudio

> test2 
     V1  V2 
1 <U+0531> <U+0532> 
2  1  10 
3  2  20 

Jednak ważniejsze są w stanie manipulować tym w R. Tak więc w moim przypadku można zauważyć, że wejście do okna skryptu Ա ma kodowanie UTF-8, a grep poprawnie znajduje to kodowanie w twojej tabeli.

> Encoding("Ա") 
[1] "UTF-8" 
> grep("Ա", as.character(test2[1,1])) 
[1] 1 

Być może trzeba będzie znaleźć odpowiednie warianty kodowania, które działają w ustawieniach lub ewentualnie je zmienić. Niestety nie jestem pewien, gdzie to się dzieje.

Możesz nie być w stanie sprawić, że będzie ładnie na wszystkich etapach, ale na pewno można go uruchomić także w środowisku Windows 7.