R 从数据文件中删除非ASCII字符

R 从数据文件中删除非ASCII字符,r,unicode,ascii,non-ascii-characters,R,Unicode,Ascii,Non Ascii Characters,我有一堆csv文件,我正在读取到R中,并以.rdata格式包含在包/数据文件夹中。不幸的是,数据中的非ASCII字符未通过检查。tools包有两个功能来检查非ASCII字符(shownascii和shownasciile),但我似乎找不到一个功能来删除/清理它们 在探索其他UNIX工具之前,最好在R中完成这一切,这样我就可以维护从原始数据到最终产品的完整工作流。是否有任何现有的包/函数可以帮助我删除非ASCII字符?要简单地删除非ASCII字符,您可以使用base R的iconv(),设置sub

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

在探索其他UNIX工具之前,最好在R中完成这一切,这样我就可以维护从原始数据到最终产品的完整工作流。是否有任何现有的包/函数可以帮助我删除非ASCII字符?

要简单地删除非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"

现在,一个稍微好一点的方法是使用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"
x[1]“Ekstrøm”“Jöreskog”“bißchen Zürcher”
stringi::stri_trans_general(x,“拉丁ascii”)
#>[1]“Ekstrom”“Joreskog”“bisschen Zurcher”

要删除所有带有非ascii字符的单词(借用@Hadley的代码),您可以将包
xfun
过滤器
一起使用
dplyr

x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher", "alex")
x

x %>% 
  tibble(name = .) %>%
  filter(xfun::is_ascii(name)== T)
x%
TIBLE(名称=)%%>%
过滤器(xfun::is_ascii(名称)==T)

我经常在iconv上遇到麻烦,我是一个基本的R迷

因此,为了删除unicode或非ASCII,我使用gsub,使用Lappy将其应用于整个数据帧

gsub("[^\u0001-\u007F]+|<U\\+\\w+>","", string)
gsub(“[^\u0001-\u007F]+|”,“字符串”)
这个gsub的好处是它将匹配一系列的符号格式。下面我展示了这两种模式的单独匹配

x1 <- c("Ekstr\xf8m", "J\xf6reskog", "bi\xdfchen Z\xfcrcher")
gsub("[^\u0001-\u007F]+","", x1)
## "Ekstrm"        "Jreskog"       "bichen Zrcher"

x1
textclean::replace_non_ascii()
为我完成了这项工作。此功能不仅删除特殊字母,还删除欧元、商标和其他符号

    x <- c("Ekstr\u00f8m \u2605", "J\u00f6reskog \u20ac", "bi\u00dfchen Z\u00fcrcher \u2122")

 stringi::stri_trans_general(x, "latin-ascii")
    [1] "Ekstrom ★"          "Joreskog €"         "bisschen Zurcher ™"
    
textclean::replace_non_ascii(x)
    [1] "Ekstrom"               "Joreskog"              "bisschen Zurcher cent"

x尝试使用正则表达式,例如函数gsub。Check?regexp您知道
read.csv()
接受一个
encoding
参数,所以您至少可以在R中处理这些?非ASCII字符失败的具体检查是什么,是在R中(如果是在这里发布),还是外部?我有什么想法可以让它与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)”,“拉丁ascii”)=>[1]“克林克大学(AA\u0090R)”
stringi::stri\u trans\u general(x,“拉丁ascii”)
删除文本中的一些非ASCII字符,但不删除其他字符。
工具::showNonASCII
显示未删除的字符有:零宽度空格、商标符号、欧元符号、窄无中断空格。这是否意味着
为“拉丁ASCII”
我的字符串的转换标识符是否错误?是否有一种简单的方法来确定正确的转换标识符?谢谢
x2 <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher")
gsub("[^\u0001-\u007F]+","", x2)
## Same as x1
## "Ekstrm"        "Jreskog"       "bichen Zrcher"
x3 <- c("<U+FDFA>", "1<U+2009>00", "X<U+203E>")
gsub("<U\\+\\w+>","", x3)
## ""    "100" "X"
    x <- c("Ekstr\u00f8m \u2605", "J\u00f6reskog \u20ac", "bi\u00dfchen Z\u00fcrcher \u2122")

 stringi::stri_trans_general(x, "latin-ascii")
    [1] "Ekstrom ★"          "Joreskog €"         "bisschen Zurcher ™"
    
textclean::replace_non_ascii(x)
    [1] "Ekstrom"               "Joreskog"              "bisschen Zurcher cent"