从 .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!
谢谢!
有几件事使这变得困难:
- 您想用大致相同的东西替换字符,而不仅仅是转换编码。在您的示例中,“
<9d>”不代表 "e",它代表 "e" 的复杂版本,这意味着 R 不仅会更改它。但是有一些功能可以做到这一点
- 看起来
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"
我看过各种关于在 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!
谢谢!
有几件事使这变得困难:
- 您想用大致相同的东西替换字符,而不仅仅是转换编码。在您的示例中,“
<9d>”不代表 "e",它代表 "e" 的复杂版本,这意味着 R 不仅会更改它。但是有一些功能可以做到这一点 - 看起来
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"