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

时间:2018-12-11 18:25:25

标签: r regex string gsub qdap

我看过很多有关删除R中特殊字符的文章(例如Remove all special characters from a string in R?),但是没有一种策略可以解决我的问题。

我有一个抄本,可通过qdap的read.transcript()读取。当我阅读文档时,它会使带有特殊字符的行看起来像这样:

$targetFolder = public_path().'/images/';
$name=$image->getClientOriginalName();
$extension = $image->getClientOriginalExtension(); // add
$picture = sha1($name . time()) . '.' . $extension; //add

$image->move($targetFolder, $picture);
$image = \Intervention\Image\Facades\Image::make(sprintf('images/%s', $picture))->encode('jpg', 75);

我尝试过:

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!

谢谢!

1 个答案:

答案 0 :(得分:4)

有几件事使这变得困难:

  1. 您想用通常相同的字符替换字符,而不仅仅是转换编码。在您的示例中,“ <9d>”不代表“ e”,而是代表“ e”的复杂版本,这意味着R不会仅仅对其进行更改。但是有功能可以做到这一点
  2. 似乎qdap.transcript会有所帮助。至少您在此处显示的内容以及您的结果与之一致,它们不是是特殊字符,而实际上是“ <9d>”。因此,如果您尝试删除特殊字符,gsub会很高兴地遵守,并删除了“ <”和““>”,而单独保留了“ e1”等。

为解决您的问题,我认为您想转换回特殊字符,然后使用stri_trans_general包中的stringi。我确定那里还有其他类似的功能,但这对我有用。事实证明,转换回特殊字符是困难的部分,但是我有一些有效的代码:

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”