在R中将原始字节作为原始字节导入

在R中将原始字节作为原始字节导入,r,postgresql,encoding,R,Postgresql,Encoding,我已将一个字符串从数据库导入R。db列类型为BYTEA Postgres。为了让我按预期使用它,它应该是raw类型。相反,它是字符类型。我想将其转换为以下意义上的raw: 字符串表示形式为 \x1f8b080000000000 如果我使用charToRaw,它将转换为数组 5c 78 31 66 38 62 30 38 1f 8b 08 00 00 00 00 00 相反,我需要它是数组 5c 78 31 66 38 62 30 38 1f 8b 08 00 00 00 00 00

我已将一个字符串从数据库导入R。db列类型为BYTEA Postgres。为了让我按预期使用它,它应该是raw类型。相反,它是字符类型。我想将其转换为以下意义上的raw:

字符串表示形式为

\x1f8b080000000000
如果我使用charToRaw,它将转换为数组

5c 78 31 66 38 62 30 38 
1f 8b 08 00 00 00 00 00
相反,我需要它是数组

5c 78 31 66 38 62 30 38 
1f 8b 08 00 00 00 00 00
我该怎么做

编辑1回复Chris

library(RPostgreSQL)
conn <- dbConnect(dbDriver("PostgreSQL"), dbname = "somename",
                  host = "1.2.3.4", port = 5432,
                  user = "someuser", password = pw)
some_value <- dbGetQuery(conn, "select value from schema.key_value where key like '%somekey%' limit 1")

some_value$value
# [1] "\\x1f8b080000000000000

这适用于将您描述的类型的单个字符串转换为RAW向量

## The string I think you're talking about
dat <- "\\x1f8b080000000000"
cat(dat, "\n")
## \x1f8b080000000000

## A function to convert one string to an array of raw
f <- function(x)  {
    ## Break into two-character segments
    x <- strsplit(x, "(?<=.{2})", perl=TRUE)[[1]]
    ## Remove the first element, "\\x"
    x <- x[-1]
    ## Complete the conversion
    as.raw(as.hexmode(x))
}

## Check that it works
f(dat)
##  [1] 1f 8b 08 00 00 00 00 00

你能分享你从数据库导入的代码吗?也许在Postgres中转换成string,然后在R中转换成charToRaw?更好的方法是在Postgres中直接强制转换为raw,不确定这是否可行,但请尝试选择convert_to value::text,“utf-8”作为schema.key_value中的值。。。然后沙托劳没有成功。尽管我付出了巨大的努力,但我还是有点震惊,因为我不能用本土的方式来做这件事。看起来效率很低。我倾向于用python或bash来处理这个问题。@artdv震惊于您不能更简单地转换\\x1f….这样的字符串。。。。到原始向量?或者震惊于不能直接从数据库获取数据到原始向量?在任何情况下,是的,如果你已经准备好了,我肯定会建议你使用你喜欢的并且更舒服的东西。后者比前者多。如果我想在数据库中存储R对象的二进制版本,那么理想的方法是什么?@artdv-我不知道最好的方法是什么,尤其是因为我不知道您的用例。可能作为包含序列化R对象的*.rds文件的路径,由saveRDS写入磁盘,由readRDS读取?1f 8b表明这是一个gzip字节数组。如何解压缩结果?