Для данных, уже находящихся в текстовых файлах, вот один из способов решения проблемы.В целом, однако, R использует обратную косую черту, немного отличающуюся от многих других языков: только несколько вещей допускают одну обратную косую черту (например, \x##
, \u####
, \n
, \b
, \r
, \t
возможно другие).Буквальная обратная косая черта - это двойная обратная косая черта.Поскольку ваши текстовые файлы имеют обратную косую черту, за которой следуют "x" и некоторые числа, R покорно считывает их как буквенные строки, а не как шестнадцатеричный код, который должен представлять \x##
.
s <- '\\x22datetime\\x22\\x3A\\x222019\\x2D05\\x2D12\\x2017\\x3A00\\x3A00\\x22\\x7D\\x5D'
Эта часть соответствует любому экземпляру \x
, но так как это R, нам нужно \\\\
для представления литерала \
... странно, я знаю.Мы также фиксируем две следующие шестнадцатеричные цифры:
gre <- gregexpr("\\\\x[0-9a-fA-F]{2}", s)
regm <- regmatches(s, gre)[[1]]
regm
# [1] "\\x22" "\\x22" "\\x3A" "\\x22" "\\x2D" "\\x2D" "\\x20" "\\x3A" "\\x3A" "\\x22" "\\x7D"
# [12] "\\x5D"
С помощью этого regm
мы можем использовать шестнадцатеричное преобразование и некоторые raw
функции для преобразования в реальные символы ascii:
sapply(as.raw(strtoi(substr(regm, 3, 4), 16L)), rawToChar)
# [1] "\"" "\"" ":" "\"" "-" "-" " " ":" ":" "\"" "}" "]"
Функция regmatches
не только извлекает определенные шаблоны в строке, она также может заменить их.
regmatches(s, gre) <- list(sapply(as.raw(strtoi(substr(regm, 3, 4), 16L)), rawToChar))
s
# [1] "\"datetime\":\"2019-05-12 17:00:00\"}]"