2012-03-29 2 views
54

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

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

+0

Попробуйте использовать регулярные выражения, например функцию gsub. Check? Regexp – aatrujillob

+0

Вы знаете, что 'read.csv()' принимает аргумент 'encoding', поэтому вы можете обрабатывать их, по крайней мере, в R? Какая конкретная проверка приведет к сбою символов, отличных от ASCII, находится ли она в R (если это так) или внешнем? – smci

ответ

63

Чтобы просто удалить символы не-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 
58

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

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

Любые мысли о том, как я могу заставить его работать с stringi - 'iconv (« Klinik. Der Univ. Zu K_ln (AA \ u0090R) »,« latin1 »,« ASCII », sub =« ») => [1] «Klinik. Der Univ. Zu K_ln (AAR)» ' , но ' stringi :: stri_trans_general («Klinik. Der Univ. Zu K_ln (AA \ u0090R)», «latin-ascii») => [1] " Klinik. Der Univ. Zu K_ln (AA \ u0090R) "' – xbsd

Смежные вопросы