Удалить специальные символы в R из .docx - PullRequest
0 голосов
/ 11 декабря 2018

Я видел различные сообщения об удалении специальных символов в R (например, этот: Удалить все специальные символы из строки в 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

Но это не удаляет специальные символы, а также удаляетthe!

Я также пытался:

 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 Ответ

0 голосов
/ 11 декабря 2018

Есть несколько вещей, которые усложняют это:

  1. Вы хотите заменить символы чем-то, что обычно одинаково, а не просто преобразовывать кодировку.В вашем примере "<9d> "не означает« e », это означает сложную версию« e », то есть R. не просто изменит ее. Но есть функции, которые делают это
  2. Похоже,qdap.transcript пытается быть полезным. По крайней мере, то, что вы показываете здесь, и ваши результаты согласуются с тем, что они не являются специальными символами, а просто буквально "<9d> ". Поэтому, если вы попытаетесь удалить специальные символы, gsub счастливо выполнит и удалит" <"и"> ", оставив" e1 "и т. Д. В покое.

Длярешить вашу проблему, я думаю, что вы хотите преобразовать обратно в специальные символы, а затем использовать stri_trans_general из пакета * 1014. * Я уверен, что есть и другие аналогичные функции, но эта работает для меня. Оказывается,преобразование обратно в специальные символы - сложная часть, но у меня есть некоторый рабочий код:

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"

...