2012-03-29 15 views
54

Ho un mucchio di file csv che sto leggendo in R e incluso in una cartella pacchetto/dati nel formato .rdata. Sfortunatamente i caratteri non ASCII nei dati falliscono il controllo. Il pacchetto tools ha due funzioni per verificare i caratteri non ASCII (showNonASCII e showNonASCIIfile) ma non riesco a trovarne uno per rimuoverli/pulirli.Rimozione di caratteri non ASCII da file di dati

Prima di esplorare altri strumenti UNIX, sarebbe bello fare tutto questo in R, così posso mantenere un flusso di lavoro completo dai dati grezzi al prodotto finale. Esistono pacchetti/funzioni esistenti per aiutarmi a sbarazzarsi dei caratteri non ASCII?

+0

Provare con espressioni regolari, ad esempio la funzione gsub. Controlla? Regexp – aatrujillob

+0

Sei consapevole che 'read.csv()' accetta un argomento 'encoding', quindi puoi gestirli, almeno in R? Quale controllo specifico falliscono i caratteri non-ASCII, è in R (se così lo si può postare qui) o esterno? – smci

risposta

63

Per semplicemente rimuovere i caratteri non-ASCII, è possibile utilizzare la base di R iconv(), impostazione sub = "". Qualcosa del genere dovrebbe funzionare:

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" 

Per individuare caratteri non ASCII, o per trovare se c'erano affatto nei file, si potrebbe probabilmente adattare le seguenti idee:

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

In questi giorni, un approccio leggermente migliore è usare il pacchetto stringi che fornisce una funzione per la conversione generale unicode. Ciò consente di conservare il più possibile il testo originale:

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

Qualche idea su come posso farlo funzionare con stringi - 'iconv (" Klinik. Der Univ. Zu K_ln (AA \ u0090R) "," latin1 "," ASCII ", sub =" ") => [1] "Klinik. Univ. Zu K_ln (AAR)" ' ma ' stringi :: stri_trans_general ("Klinik. Der Univ. Zu K_ln (AA \ u0090R)", "latin-ascii") => [1] " Klinik. Der Univ. Zu K_ln (AA \ u0090R) "' – xbsd

Problemi correlati