Как разобрать шестнадцатеричные коды из данных JSON в R - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть JSON, извлеченный из Интернета в таком формате:

\x22datetime\x22\x3A\x222019\x2D05\x2D12\x2017\x3A00\x3A00\x22\x7D\x5D

Если я копирую и вставляю данные, они достаточно хорошо анализируются:

\"datetime\":\"2019-05-12 17:00:00\"}]

Однакокогда я импортирую данные в виде текстового файла или когда они извлекаются из Интернета с использованием rvest, каждый обратный слеш отображается как двойной обратный слеш:

\\x22datetime\\x22\\x3A\\x222019\\x2D05\\x2D12\\x2017\\x3A00\\x3A00\\x22\\x7D\\x5D

Я хотел бы знать, как получить Rчтобы проанализировать шестнадцатеричные коды как специальные символы, то есть, чтобы это выглядело так:

"datetime":"2019-05-12 17:00:00"}]

Ответы [ 2 ]

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

Для данных, уже находящихся в текстовых файлах, вот один из способов решения проблемы.В целом, однако, 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\"}]"
0 голосов
/ 21 декабря 2018

Я думаю, что основная проблема связана со соскребанием, поскольку похоже, что вы импортируете буквально строки типа "\ x22" вместо закодированного ":".

Но для эмуляции "что быЯ получаю, если я набрал этот ввод в приглашении ", вы можете использовать eval и parse, например:

input <- readLines(file) # Or similar
# Next line for testing, note both single and double quotes
input <- '"\\x22datetime\\x22\\x3A\\x222019\\x2D05\\x2D12\\x2017\\x3A00\\x3A00\\x22\\x7D\\x5D"'
result <- eval(parse(text=input))
...