R не обнаруживает \ x шаблон в строке - PullRequest
2 голосов
/ 13 июня 2019

знает ли кто-нибудь, как можно обнаружить и заменить "\ x" в R?

library(stringr)
x <- "gesh\xfc"
str_detect(x, "\\x")
# Error in stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)) : 
# Unrecognized backslash escape sequence in pattern. (U_REGEX_BAD_ESCAPE_SEQUENCE)

nchar(x)
# Error in nchar(x) : invalid multibyte string, element 1

iconv(x, "latin1", "utf-8")
# [1] "geshü"
Encoding(x)
# [1] "unknown"

Информация о сеансе:

> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6

...

locale:
[1] fr_CH.UTF-8/fr_CH.UTF-8/fr_CH.UTF-8/C/fr_CH.UTF-8/fr_CH.UTF-8

Контекст: я прочитал a.CSV-файл с data.table::fread(), но этот файл имеет названия столбцов на немецком языке с такими буквами, как ä, ö, ü и т. д.После прочтения на R эти буквы превращаются во что-то, начинающееся с "\x".Впоследствии это просто невозможно использовать в R.

1 Ответ

2 голосов
/ 13 июня 2019

Просто чтобы подвести итог, что здесь произошло. "\ X" НЕ является частью строки. Это просто, как R избегает значений, которые он не может печатать иначе. В случае «gesh \ xfc» первые 4 символа являются основными символами ASCII, но последний кодированный символ - «\ xfc». В кодировке latin1 (которую Windows использует по умолчанию) символ fc является символом «ü». Так что в моей машине Windows, я вижу

x <- "gesh\xfc"
x
# [1] "geshü"

И вы можете посмотреть необработанные байты этой строки с помощью

charToRaw("gesh\xfc")
# [1] 67 65 73 68 fc

Вы можете видеть шестнадцатеричные коды символов ASCII для первых 4 значений, а затем вы можете видеть, что \x фактически использовался только для включения кода символа "fc" в строку. Сама строка имеет только 5 «символов».

Но если вы не используете latin1, символ "fc" не сопоставляется ни с чем. По сути, эта строка не имеет никакого смысла в кодировке utf-8, которую по умолчанию использует mac. Вы можете конвертировать в utf-8 с помощью

iconv("gesh\xfc", "latin1", "utf-8")

Но так как вы получили этот файл путем импорта текстового файла, проблема заключалась в том, что R не знал, что кодировка файла не была UTF-8, поэтому вы получили эти странные значения. Вы должны сообщить fread, что файл пришел из windows, чтобы он мог правильно импортировать строки с самого начала

fread(file, encoding = "Latin-1")

Вам необходимо знать, какая кодировка использовалась для создания файла, который вы импортируете, особенно когда он сделан кем-то другим. Программы не могут правильно угадать.

...