2012-03-29 65 views
54

我有一堆csv文件,我正在读入R,并且包含在格式为.rdata的包/数据文件夹中。不幸的是,数据中的非ASCII字符未通过检查。 tools包有两个功能来检查非ASCII字符(showNonASCIIshowNonASCIIfile),但我似乎无法找到一个删除/清除它们。删除数据文件中的非ASCII字符

在研究其他UNIX工具之前,最好在R中完成这些工作,这样我就可以维护从原始数据到最终产品的完整工作流程。是否有任何现有的软件包/函数可以帮助我摆脱非ASCII字符?

+0

尝试使用正则表达式,例如函数gsub。 Check?regexp – aatrujillob 2012-03-29 23:22:49

+0

您知道'read.csv()'带有'encoding'参数,所以您可以处理这些参数,至少在R中?非ASCII字符有什么特别的检查失败,它是在R(如果这么张贴在这里),或外部? – smci 2016-08-12 08:02:48

回答

63

要简单地删除非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 
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 2017-11-13 01:27:29