Usuwanie znaków innych niż ASCII z plików danych

Mam kilka csv plików, które Wczytuję do R i umieszczam w folderze package/data w formacie .rdata. Niestety znaki spoza ASCII w danych nie sprawdzają się. Pakiet tools ma dwie funkcje do sprawdzania znaków innych niż ASCII (showNonASCII i showNonASCIIfile), ale nie mogę zlokalizować jednej, aby je usunąć / wyczyścić.

Zanim przejrzę Inne narzędzia uniksowe, byłoby wspaniale zrobić to wszystko w R, abym mógł utrzymać pełny przepływ pracy od surowych danych do końcowego produktu. Czy są jakieś istniejące pakiety / funkcje, które pomogą mi pozbyć się znaków innych niż ASCII?

Author: smci, 2012-03-30

2 answers

Aby po prostu usunąć znaki spoza ASCII, możesz użyć podstawowej litery R iconv(), ustawiając sub = "". Coś takiego 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"

To locate non-ASCII characters, or to find if there was any at all in your files, you could likely adapt the following 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
 72
Author: Josh O'Brien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 00:30:15

Obecnie nieco lepszym podejściem jest użycie pakietu stringi, który zapewnia funkcję do ogólnej konwersji unicode. Pozwala to na zachowanie oryginalnego tekstu w jak największym 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"
 66
Author: hadley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-16 13:17:32