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

Mai*_*ura 70 unicode ascii r non-ascii-characters

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

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

Jos*_*ien 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"
Run Code Online (Sandbox Code Playgroud)

查找非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
Run Code Online (Sandbox Code Playgroud)


had*_*ley 73

目前,稍微好一点的方法是使用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"
Run Code Online (Sandbox Code Playgroud)

  • `stringi::stri_trans_general(x, "latin-ascii")` 删除了文本中的一些非 ASCII 字符,但不删除其他字符。`tools::showNonASCII` 显示非删除字符有:零宽度空格、商标符号、欧元符号、窄不间断空格。这是否意味着“latin-ascii”是我的字符串的错误转换标识符?有没有一种简单的方法可以找出正确的转换标识符?谢谢 (4认同)