代码之家  ›  专栏  ›  技术社区  ›  J.Sabree

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

  •  1
  • J.Sabree  · 技术社区  · 7 年前

    我看到过关于删除R中特殊字符的各种帖子(例如: Remove all special characters from a string in R? ),但这些策略对我的问题都不起作用。

    我有一份成绩单,我正在读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!
    

    因此,特殊字符按“应该”的形式读入。如果这是不可能的,老实说,如果它只是删除了特殊字符(但不是其他字符,如感叹号),并看起来像这样,我会没事的:

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

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Emil Bode    7 年前

    1. 看起来像 qdap.transcript 是特殊字符,但只是字面上的“e1><b8><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”

    推荐文章