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

时间:2012-03-29 23:06:17

标签: r unicode ascii non-ascii-characters

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

在我探索其他UNIX工具之前,在R中执行此操作会很棒,因此我可以维护从原始数据到最终产品的完整工作流程。是否有任何现有的软件包/函数可以帮助我摆脱非ASCII字符?

5 个答案:

答案 0 :(得分:75)

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

答案 1 :(得分:72)

现在,稍微好一点的方法是使用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"

答案 2 :(得分:1)

我经常在使用 iconv 时遇到问题,而且我是 R 的基本粉丝。

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

gsub("[^\u0001-\u007F]+|<U\\+\\w+>","", string)

这个 gsub 的好处是它将匹配一系列符号格式。下面我展示了两种模式的个别匹配。

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

答案 3 :(得分:0)

要删除所有带有非ASCII字符的单词(从@Hadley借用代码),可以将xfun包与filter中的dplyr一起使用

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

x %>% 
  tibble(name = .) %>%
  filter(xfun::is_ascii(name)== T)

答案 4 :(得分:0)

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"