R- 删除字符串中的重音符号

Posted

技术标签:

【中文标题】R- 删除字符串中的重音符号【英文标题】:R- delete accents in string 【发布时间】:2014-12-11 04:00:47 【问题描述】:

我有一个包含 html 文件的库,在 files_dep 中我有它们的列表。我需要将存储在其中的文本转换为表格,但问题是它们有重音符号和ñ。我写这个是为了阅读它并且工作正常。

for (i in files_dep) 
  text<-readLines(i,encoding="UTF-8")
  aa<-paste(text, collapse=' ')
  if (grepl(empieza,aa) & grepl(termina,aa)) 
    nota=gsub(paste0("(^.*", empieza, ")(.*?)(", termina, ".*)$"), "\\2", aa)
    #nota<-iconv(nota,to="ASCII//TRANSLIT")
    df<-rbind(df, data.frame(fileName=i, nota=nota))   

我可以阅读以下内容:

Este sábado enfrentarán a un equipo.

所以我只需要删除重音符号。 我尝试取消注释

nota <- iconv(nota,to="ASCII//TRANSLIT")

但我明白了:

 Este sA!bado se enfrentarA!n a un equipo. 

所以,我不知道问题出在哪里。

另外,我需要删除重音符号和所有特殊字符。谢谢

版本:

我在循环结束时取出了存储在 nota 中的最后一个数据。这是我看到的:

nota
[1] "                         <p>La inclusión del seleccionado argentino en el viejo Tres Naciones significó, hace tres años, la confirmación de que el nivel del rugby argentino estaba a la altura de los grandes equipos del planeta, aunque se preveía que esa transición entre ser un equipo <em>del montón</em>&nbsp;a formar parte de la<em> elite </em>no iba a ser sencilla<em>. </em>Hoy, luego de dos años de competencia en el Rugby Championship, Los Pumas están cada vez más cerca de dar el batacazo y conseguir su primer triunfo en la historia del torneo.</p><p>

如果我这样做:

iconv(nota,to="ASCII//TRANSLIT")

我明白了:

iconv(nota,to="ASCII//TRANSLIT")
[1] "                         <p>La inclusiA3n del seleccionado argentino en el viejo Tres Naciones significA3, hace tres aA?os, la confirmaciA3n de que el nivel del rugby argentino estaba a la altura de los grandes equipos del planeta, aunque se preveA-a que esa transiciA3n entre ser un equipo <em>del montA3n</em>&nbsp;a formar parte de la<em> elite </em>no iba a ser sencilla<em>. </em>Hoy, luego de dos aA?os de competencia en el Rugby Championship, Los Pumas estA!n cada vez mA!s cerca de dar el batacazo y conseguir su primer triunfo en la historia del torneo.

【问题讨论】:

您使用的是什么操作系统和 R 版本?当我运行nota&lt;-"Este sábado enfrentarán a un equipo."; iconv(nota, to="ASCII//TRANSLIT") 时,我得到"Este sabado enfrentaran a un equipo." 在Windows 上运行R 3.1.1。 @MrFlick - 它可能也与语言环境有关。上面的代码对我来说是一样的,但我在一个“English_United States”的语言环境中,根据Sys.getlocale() @thelatemail 我得到 > Sys.getlocale() [1] "LC_COLLATE=Spanish_Spain.1252;LC_CTYPE=Spanish_Spain.1252;LC_MONETARY=Spanish_Spain.1252;LC_NUMERIC=C;LC_TIME=Spanish_Spain.1252" @thelatemail 在iconv的情况下,它应该只受Encoding(nota)的影响,但你是对的,默认语言环境可能会影响编码,但如果你使用的是@987654333 @ 和 encoding="UTF-8" 应该将所有内容保持为 UTF-8。 @MrFlick,如果我这样做,我也会得到正确的结果,问题在循环内。不知道为什么。 > iconv("este sabado" ,to="ASCII//TRANSLIT") [1] "este sabado" 【参考方案1】:

当我遇到类似问题时,我使用了 stringi 包中的函数 stri_trans_general。比如你可以试试:stri_trans_general(nota,"Latin-ASCII")

【讨论】:

【参考方案2】:

我用这个功能

 rm_accent <- function(str,pattern="all") 
   if(!is.character(str))
    str <- as.character(str)

  pattern <- unique(pattern)

  if(any(pattern=="Ç"))
    pattern[pattern=="Ç"] <- "ç"

  symbols <- c(
    acute = "áéíóúÁÉÍÓÚýÝ",
    grave = "àèìòùÀÈÌÒÙ",
    circunflex = "âêîôûÂÊÎÔÛ",
    tilde = "ãõÃÕñÑ",
    umlaut = "äëïöüÄËÏÖÜÿ",
    cedil = "çÇ"
  )

  nudeSymbols <- c(
    acute = "aeiouAEIOUyY",
    grave = "aeiouAEIOU",
    circunflex = "aeiouAEIOU",
    tilde = "aoAOnN",
    umlaut = "aeiouAEIOUy",
    cedil = "cC"
  )

  accentTypes <- c("´","`","^","~","¨","ç")

  if(any(c("all","al","a","todos","t","to","tod","todo")%in%pattern)) # opcao retirar todos
    return(chartr(paste(symbols, collapse=""), paste(nudeSymbols, collapse=""), str))

  for(i in which(accentTypes%in%pattern))
    str <- chartr(symbols[i],nudeSymbols[i], str) 

  return(str)

【讨论】:

以上是关于R- 删除字符串中的重音符号的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .NET 中的字符串中删除变音符号(重音符号)?

如何从 .NET 中的字符串中删除变音符号(重音符号)?

从字符串中删除重音符号

PHP 从字符串中删除重音符号

删除 mysql 查询中字符串字段的重音符号

MySQL 表中带有重音符号的字符串在 R (RODBC) 中返回为 NA