【问题标题】:Import raw bytes as raw bytes in R将原始字节作为原始字节导入 R
【发布时间】:2016-03-31 20:50:07
【问题描述】:

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

字符串表示是

\x1f8b080000000000

如果我使用charToRaw,则转换为数组

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

【问题讨论】:

  • 你能分享你用来从数据库导入的代码吗?
  • 可能在 Postgres 中转换为字符串,然后在 R 中返回 charToRaw?更好的方法是在 Postgres 中直接转换为 raw,但不确定是否可行
  • 尝试select convert_to(value::text, 'utf-8') as value from schema.key_value ... 然后charToRaw() 没有成功。虽然勇敢的努力。

标签: r postgresql encoding


【解决方案1】:

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

## 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

【讨论】:

  • 我有点震惊,我不能以原生方式做到这一点。看起来真的很没效率。我倾向于在 python 或 bash 中处理这个问题。
  • @artdv 震惊于您不能更简单地将"\\x1f...." 之类的字符串转换为原始向量?或者震惊于您不能直接从数据库中获取数据到原始向量中?无论如何,是的,如果你准备好了,我肯定会建议使用你喜欢并且更舒服的东西。
  • 后者比前者多。如果我想将 R 对象的二进制版本存储在数据库中,所需的方法是什么?
  • @artdv -- 我不知道什么是最好的方法,尤其是。因为我不知道你的用例。也许作为"*.rds" 文件的路径(包含序列化的R 对象,由saveRDS() 写入磁盘(并由readRDS() 读取))?
  • 1f 8b 表明这是一个压缩字节数组。如何解压结果?
猜你喜欢
  • 2016-04-11
  • 1970-01-01
  • 2012-03-15
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2019-05-02
相关资源
最近更新 更多