2012-03-29 13 views
54

Mam kilka plików csv, które czytam do R i w tym w folderze pakiet/dane w formacie .rdata. Niestety, znaki spoza ASCII w danych nie sprawdzają. Pakiet tools ma dwie funkcje sprawdzania znaków spoza ASCII (showNonASCII i showNonASCIIfile), ale nie mogę zlokalizować jednego, aby je usunąć/wyczyścić.Usuwanie znaków spoza ASCII z plików danych

Zanim przejdę do innych narzędzi UNIX, byłoby wspaniale zrobić to wszystko w R, więc mogę utrzymać pełny przepływ pracy od surowych danych do końcowego produktu. Czy istnieją jakieś pakiety/funkcje, które pomogą mi pozbyć się znaków spoza ASCII?

+0

Wypróbuj za pomocą wyrażeń regularnych, na przykład funkcji gsub. Sprawdź? Regexp – aatrujillob

+0

Masz świadomość, że 'read.csv()' pobiera argument "kodowania", więc możesz obsłużyć te, przynajmniej w R? Jakiego specyficznego sprawdzenia nie udają się znaki spoza zestawu ASCII, czy jest to w R (jeśli tak, to tutaj), czy na zewnątrz? – smci

Odpowiedz

63

po prostu usunąć znaki spoza ASCII, można użyć baza R na iconv() ustawienie sub = "". Coś jak to powinno działać:

x <- c("Ekstr\xf8m", "J\xf6reskog", "bi\xdfchen Z\xfcrcher") # e.g. from ?iconv 
Encoding(x) <- "latin1" # (just to make sure) 
x 
# [1] "Ekstrøm"   "Jöreskog"  "bißchen Zürcher" 

iconv(x, "latin1", "ASCII", sub="") 
# [1] "Ekstrm"  "Jreskog"  "bichen Zrcher" 

Aby zlokalizować znaków spoza ASCII, albo znaleźć, gdyby nie było w ogóle w plikach, można prawdopodobnie dostosować następujące pomysły:

## Do *any* lines contain non-ASCII characters? 
any(grepl("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII"))) 
[1] TRUE 

## Find which lines (e.g. read in by readLines()) contain non-ASCII characters 
grep("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII")) 
[1] 1 2 3 
58

W dzisiejszych czasach nieco lepszym rozwiązaniem jest użycie pakietu stringi, który zapewnia funkcję ogólnej konwersji w Unicode. Pozwala to zachować oryginalny tekst w maksymalnym możliwym stopniu:

x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher") 
x 
#> [1] "Ekstrøm"   "Jöreskog"  "bißchen Zürcher" 

stringi::stri_trans_general(x, "latin-ascii") 
#> [1] "Ekstrom"   "Joreskog"   "bisschen Zurcher" 
+0

Wszelkie przemyślenia, w jaki sposób mogę sprawić, by działał on z stringi - 'iconv (" Klinik der Univ. Zu K_ln (AA \ u0090R) "," latin1 "," ASCII ", sub =" ") => [1] "Klinik der Univ. Zu K_ln (AAR)" ' ale ' stringi :: stri_trans_general ("Klinik der Univ. Zu K_ln (AA \ u0090R)", "latin-ascii") => [1] " Klinik der Univ. Zu K_ln (AA \ u0090R) " – xbsd

Powiązane problemy