2016-03-31 9 views
4

データベースから文字列をRにインポートしました。 db列のタイプはBYTEA(Postgres)です。私が意図したとおりに使用するためには、タイプはrawでなければなりません。代わりに、タイプはcharacterです。私は、次の意味での生に変換したい:生のバイトを生のバイトとしてインポートするR

文字列表現は、私がcharToRawを使用している場合、それは、配列

5c 78 31 66 38 62 30 38 

に変換され

\x1f8b080000000000 

である代わりに、私はそれがする必要があります配列である

1f 8b 08 00 00 00 00 00 

これを達成するにはどうすればよいですか?

編集#1返信クリス

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 
+0

データベースからインポートする際に使用したコードを共有できますか? – Chris

+1

は、Postgresで文字列にキャストしてから、Rで一度 'charToRaw'にキャストすることができますか?より良い方法はPostgresのrawに直接キャストすることですが、それが可能であるかどうかはわかりませんが、 – Chris

+0

を試してみてください。schema.key_value ...から値convert_to(value :: text、 'utf-8')を選択しようとしました。 '' charToRaw () '成功しません。しかし、勇敢な努力。 – artdv

答えて

3

これは、あなたがの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 
+0

私はネイティブな方法でこれを行うことができないことに少しショックを受けました。本当に非効率だと思う。私はこれをPythonまたはbashで扱うことに傾いています。 – artdv

+0

@artdv '' \\ x1f .... "'のような文字列を単純に元のベクトルに変換することはできません。または、データベースから生ベクターに直接データを取得できないことにショックを受けましたか?いずれにせよ、ええ、私は間違いなくあなたが好きなものを使うことをお勧めします。 –

+0

後者は前者よりも。 Rオブジェクトのバイナリバージョンをデータベースに格納したい場合は、どのようなアプローチが必要ですか? – artdv

関連する問題