我从网络上以以下格式抓取了JSON:
something.light
如果我将数据复制并粘贴到其中,则可以很好地解析:
\x22datetime\x22\x3A\x222019\x2D05\x2D12\x2017\x3A00\x3A00\x22\x7D\x5D
但是,当我将数据导入为文本文件或使用\"datetime\":\"2019-05-12 17:00:00\"}]
从网络上将其抓取时,每个反斜杠都显示为双反斜杠:
rvest
我想知道如何让R将十六进制代码解析为特殊字符,即,它看起来像这样:
\\x22datetime\\x22\\x3A\\x222019\\x2D05\\x2D12\\x2017\\x3A00\\x3A00\\x22\\x7D\\x5D
答案 0 :(得分:0)
我认为主要问题在于抓取,因为看起来您要导入的实际上是字符串,例如“ \ 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))
答案 1 :(得分:0)
对于文本文件中已有的数据,这是解决问题的一种方法。不过,通常来说,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\"}]"