从 .docx 中删除 R 中的特殊字符

Remove special characters in R from .docx

我看过各种关于在 R 中删除特殊字符的帖子(例如这篇文章:Remove all special characters from a string in R?),但是 none 的策略对我的问题有效。

我有一份成绩单,我正在使用 qdap 的 read.transcript() 阅读。当我阅读文档时,它使带有特殊字符的行看起来像这样:

If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!

我试过:

     ATL1$X2 <- gsub("[^0-9A-Za-z///,.?()' ]", "", ATL1$X2)
     If anyone knows how to simply change these special characters (i.e e1b89d to e), again please feel free to update

但这并没有删除特殊字符,也删除了 !

我也试过:

 str_replace_all(ATL1$X2, "[^[:alnum:]]", " ")
If anyone knows how to simply change these special characters  i e  e1  b8  9d  to e   again please feel free to update 

但这更糟,删除了所有标点符号,但仍然没有解决我的问题。

最后,我也试过了:

 iconv(ATL1$X2, from = 'UTF-8', to = 'ASCII//TRANSLIT')
 If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!

但这里也没有任何改变。

在理想情况下,输出如下所示:

 If anyone knows how to simply change these special characters (i.e e e e to e), again please feel free to update!

因此,特殊字符将按原样读入 "should"。如果这是不可能的,老实说,如果它只是删除特殊字符(而不是其他字符,如感叹号)并且看起来像这样,我会很好:

 If anyone knows how to simply change these special characters (i.e to e), again please feel free to update!

谢谢!

有几件事使这变得困难:

  1. 您想用大致相同的东西替换字符,而不仅仅是转换编码。在您的示例中,“<9d>”不代表 "e",它代表 "e" 的复杂版本,这意味着 R 不仅会更改它。但是有一些功能可以做到这一点
  2. 看起来 qdap.transcript 试图提供帮助。至少你在这里显示的和你的结果是一致的,它们 不是 是特殊字符,而只是字面上的“<9d>”。因此,如果您尝试删除特殊字符,gsub 会愉快地执行,并删除“<”和“>”,留下 "e1" 等等。

为了解决你的问题,我想你想转换回特殊字符,然后使用 stringi 包中的 stri_trans_general。我敢肯定还有其他类似的功能,但这个对我有用。事实证明转换回特殊字符是困难的部分,但我有一些工作代码:

library(stringi)
mystring <- 'If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!'
pos <- gregexpr('(<[A-Fa-f0-9]{2}>)+', mystring)[[1]]

replace <- substring(mystring, pos, pos+attr(pos, 'match.length')-1)
replace <- sapply(replace, function(r) {
  eval(parse(text=paste0('\'', gsub('>', '', gsub('<', '\\x', r)), '\'')))
})
for(i in seq_along(replace)) {
  mystring <- sub('(<[A-Fa-f0-9]{2}>)+', replace[i], mystring)
}
mystring <- stri_trans_general(mystring, 'latin-ascii')

我们首先提取“<”和“>”之间看起来像十六进制的所有内容,然后将它们转换为文字“\xe1\xb8\x9d”,然后让 R 处理它,并将旧值替换为那些替换。
只有在最后一行,我们将特殊字符替换为(在本例中)"e"