2012-03-29 35 views
54

Tôi có một bó các tệp csv mà tôi đang đọc vào R và bao gồm trong thư mục gói/dữ liệu ở định dạng .rdata. Thật không may, các ký tự không phải ASCII trong dữ liệu không kiểm tra được. Gói tools có hai chức năng để kiểm tra các ký tự không phải ASCII (showNonASCIIshowNonASCIIfile) nhưng dường như tôi không thể xác định vị trí một để xóa/xóa chúng.Xóa các ký tự không phải ASCII khỏi các tệp dữ liệu

Trước khi khám phá các công cụ UNIX khác, thật tuyệt vời khi thực hiện tất cả trong R để tôi có thể duy trì luồng công việc hoàn chỉnh từ dữ liệu thô đến sản phẩm cuối cùng. Có bất kỳ gói/chức năng hiện có nào để giúp tôi loại bỏ các ký tự không phải ASCII không?

+0

Hãy thử với các biểu thức chính quy, ví dụ như hàm gsub. Kiểm tra? Regexp – aatrujillob

+0

Bạn biết rằng 'read.csv()' lấy đối số 'encoding', vì vậy bạn có thể xử lý chúng, ít nhất là trong R? Kiểm tra cụ thể nào các ký tự không phải ASCII không thành công, có phải là trong R (nếu vậy hãy đăng nó ở đây) hay bên ngoài? – smci

Trả lời

63

Để chỉ cần xóa ký tự không phải ASCII, bạn có thể sử dụng số cơ sở R iconv(), thiết lập sub = "". Một cái gì đó như thế này nên làm việc:

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" 

Để xác định vị trí ký tự ASCII, hoặc để tìm nếu có bất kỳ ở tất cả các tập tin của bạn, bạn có thể có thể thích nghi với những ý tưởng sau đây:

## 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

Những ngày này, một cách tiếp cận tốt hơn một chút là sử dụng gói stringi cung cấp một chức năng để chuyển đổi unicode chung. Điều này cho phép bạn giữ nguyên văn bản gốc càng nhiều càng tốt:

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

Bất kỳ suy nghĩ nào về cách tôi có thể làm cho nó hoạt động với stringi - 'iconv (" Klinik. Der Univ. Zu K_ln (AA \ u0090R) "," latin1 "," ASCII ", sub =" ") => [1] "Klinik. Der Univ. Zu K_ln (AAR)" ' nhưng ' stringi :: stri_trans_general ("Klinik. Der Univ. Zu K_ln (AA \ u0090R)", "latin-ascii") => [1] " Klinik. Der Univ. Zu K_ln (AA \ u0090R) " – xbsd

Các vấn đề liên quan