Удаление символов, отличных от ASCII, из файлов данных
У меня есть куча файлов csv
, которые я читаю в R и включаю в папку пакета/данных в формате .rdata
. К сожалению, не-ASCII-символы в данных не проходят проверку. Пакет tools
имеет две функции для проверки символов, отличных от ASCII (showNonASCII
и showNonASCIIfile
), но я не могу найти их, чтобы удалить/очистить их.
Прежде чем я изучу другие инструменты UNIX, было бы здорово сделать все это в R, чтобы я мог поддерживать полный рабочий процесс из необработанных данных в конечный продукт. Существуют ли какие-либо существующие пакеты/функции, которые помогут мне избавиться от символов, отличных от ASCII?
Ответы
Ответ 1
Чтобы просто удалить символы, отличные от ASCII, вы можете использовать base 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
Ответ 2
В наши дни несколько лучше подходит использование пакета 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"
Ответ 3
Чтобы удалить все слова с не-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)