Eliminar caracteres que no sean ASCII de los archivos de datos

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

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?

Para eliminar simplemente los caracteres que no son ASCII, puede usar el iconv() R de la base iconv() , configurando sub = "" . Algo como esto debería funcionar:

 x <- c("Ekstr\xf8m", "J\xf6reskog", "bi\xdfchen Z\xfcrcher") # eg 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 localizar caracteres que no sean ASCII, o para encontrar si hubo alguno en sus archivos, es probable que pueda 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 (eg 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 

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"