Проблема со строками с <U + 0092> символами Юникода
У меня есть очень большой набор данных (70 тыс. Строк, 2600 столбцов, формат CSV), который я создал посредством веб-очистки. К сожалению, делая предварительную обработку, обработку и т. Д. В какой-то момент некоторые проблемные символы стали закодированы странным образом, и у меня возникли проблемы с ними.
У меня есть строки, подобные следующим:
x = "but it doesn<U+0092>t matter"
Поиск кодамы видим, что это должен быть персонаж’
что на самом деле должно быть'
(данные генерируются пользователем, поэтому могут содержать все виды нечетных символов). Хотя, глядя на этого персонажа, кажется, что у других тоже есть проблемы с ним (1, 2, 3). Он помечен управляющим персонажем, не уверен, что это такое, но, возможно, именно поэтому с ним так трудно иметь дело.
Большинство других вопросов о Unicode в R касаются Unicode в таком формате\u0092
.
Encoding()
Давай попробуем:
#> x = "but it doesn<U+0092>t matter"
#> Encoding(x)
#[1] "unknown"
#> Encoding(x) = "UTF-8"
#> Encoding(x)
#[1] "unknown"
#> x
#[1] "but it doesn<U+0092>t matter"
Так что это, похоже, ничего не делает.
Используйте функции взлома из этих предыдущих вопросовЕсть несколько предыдущих вопросов, которые касаются этого формата Unicode и пытаются конвертировать их:
Показать юникод в Rgsub в R с заменой юникода дают разные результаты под Windows по сравнению с Unix?Как ни странно, пример, который они дают, работает, а мой нет.
#> test.string <- "This is a <U+03B1> <U+03B2> <U+03B2> <U+03B3> test <U+03B4> string."
#> Encoding(test.string)
#[1] "unknown"
#> to_true_unicode(test.string)
#[1] "This is a α β β γ test δ string."
Но:
#> x2 = to_true_unicode(x)
#> x2
#[1] "but it doesn\u0092t matter"
#> cat(x2)
#but it doesnt matter
#> Encoding(x2)
#[1] "UTF-8"
Итак, удалось преобразовать в\u
формат из <U+....>
формат и использованиеcat()
печатает символ без этого символа (или символ ошибки на SO).
У меня есть только ограниченное количество этих проблем, поэтому я мог бы просто использовать поиск-замену для их решения. Тем не мение:
#> #base-r
#> gsub(x = x, pattern = "<U+0092>", replacement = "'")
#[1] "but it doesn<U+0092>t matter"
#> #stringr/stringi
#> library(stringr)
#> str_replace(x, pattern = "<U+0092>", "'")
#[1] "but it doesn<U+0092>t matter"
Таким образом, замена, кажется, не работает, но она работает на\u
версии:
#> #base-r
#> gsub(x = x2, pattern = "\u0092", replacement = "'")
#[1] "but it doesn't matter"
#> #stringr/stringi
#> library(stringr)
#> str_replace(x2, pattern = "\u0092", "'")
#[1] "but it doesn't matter"
Итак, это предлагает рабочий метод: 1) конвертировать<U+>
отформатировать в\u
формат, затем используйте поиск-замену.
stringi::stri_unescape_unicode()
Кажется, не работает ни с одной из версий:
#> stringi::stri_unescape_unicode(x)
#[1] "but it doesn<U+0092>t matter"
#> stringi::stri_unescape_unicode(x2)
#[1] "but it doesn\u0092t matter"
Есть ли какой-нибудь общепринятый способ решения таких проблем?
Моя настройкаМоя сессияInfo:
> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
locale:
[1] LC_COLLATE=Danish_Denmark.1252 LC_CTYPE=Danish_Denmark.1252 LC_MONETARY=Danish_Denmark.1252
[4] LC_NUMERIC=C LC_TIME=Danish_Denmark.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] stringr_1.0.0
loaded via a namespace (and not attached):
[1] magrittr_1.5 tools_3.2.3 stringi_1.0-1
Запуск R через RStudio (0.99.893, предварительный просмотр) в Windows 8.1, 64-разрядная версия. Клавиатура и единицы времени датские, но все остальное на английском.