2012-03-29 64 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