Удаление не-ASCII символов из файлов данных - PullRequest
67 голосов
/ 30 марта 2012

У меня есть куча csv файлов, которые я читаю в R и включаю в папку package / data в формате .rdata. К сожалению, не-ASCII символы в данных не проходят проверку. Пакет tools имеет две функции для проверки не-ASCII-символов (showNonASCII и showNonASCIIfile), но я не могу найти ни одного, чтобы удалить / очистить их.

Прежде чем я исследую другие инструменты UNIX, было бы здорово сделать все это в R, чтобы я мог поддерживать полный рабочий процесс от необработанных данных до конечного продукта. Существуют ли какие-либо пакеты / функции, которые помогут мне избавиться от символов, не относящихся к ASCII?

Ответы [ 3 ]

75 голосов
/ 30 марта 2012

Чтобы просто удалить не-ASCII-символов, вы можете использовать базовые R iconv(), установив sub = "".Примерно так должно работать:

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"

Чтобы найти не-ASCII символов, или чтобы найти, есть ли вообще какие-либо в ваших файлах, вы, вероятно, можете адаптировать следующие идеи:

## 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 голосов
/ 16 мая 2016

В наши дни, немного лучше подходить к использованию пакета stringi, который предоставляет функцию для общего преобразования юникода.Это позволяет максимально сохранить исходный текст:

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 голосов
/ 07 мая 2019

Чтобы удалить все слова с не-символами ascii (заимствование кода из @Hadley), вы можете использовать пакет xfun с filter из dplyr

x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher", "alex")
x

x %>% 
  tibble(name = .) %>%
  filter(xfun::is_ascii(name)== T)
...