2012-03-29 29 views
54

Tengo un montón de archivos csv que estoy leyendo en R y que están incluidos en una carpeta de paquete/datos en el formato .rdata. Lamentablemente, los caracteres que no son ASCII en los datos no pasan el control. El paquete tools tiene dos funciones para buscar caracteres que no sean ASCII (showNonASCII y showNonASCIIfile) pero parece que no puedo encontrar uno para eliminarlos/limpiarlos.Eliminando caracteres no ASCII de archivos de datos

Antes de explorar otras herramientas de UNIX, sería genial hacerlo todo en R para poder mantener un flujo de trabajo completo desde los datos sin procesar hasta el producto final. ¿Hay algún paquete/función existente que me ayude a deshacerme de los caracteres que no son ASCII?

+0

Pruebe con expresiones regulares, por ejemplo, la función gsub. Check? Regexp – aatrujillob

+0

Sabe que 'read.csv()' toma un argumento 'encoding', por lo que puede manejar estos, al menos en R? ¿Qué comprobación específica fallan los caracteres que no son ASCII, está en R (si es así, publíquela aquí) o externa? – smci

Respuesta

63

Para quitar simplemente los caracteres no ASCII, se puede utilizar la base de iconv() R, el establecimiento de sub = "". Algo como esto debería funcionar:

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" 

Para localice caracteres no ASCII, o para saber si hay alguna en absoluto en sus archivos, es probable que se podía adaptar las siguientes ideas:

## 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

En estos días, un enfoque un poco mejor es usar el paquete de stringi que proporciona una función para la conversión de Unicode en general. Esto le permite conservar el texto original tanto como sea posible:

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

Cualquier idea de cómo puedo hacer que funcione con stringi - 'iconv (" Klinik. Der Univ. Zu K_ln (AA \ u0090R) "," latin1 "," ASCII ", sub =" ") => [1] "Klinik. Der Univ. Zu K_ln (AAR)" ' pero ' stringi :: stri_trans_general ("Klinik. Der Univ. Zu K_ln (AA \ u0090R)", "latin-ascii") => [1] " Klinik. Der Univ. Zu K_ln (AA \ u0090R) "' – xbsd

Cuestiones relacionadas