将十六进制的列转换为R中的文本
Posted
技术标签:
【中文标题】将十六进制的列转换为R中的文本【英文标题】:Convert column of Hex into Text in R 【发布时间】:2022-01-17 03:48:18 【问题描述】:我是 R 新手,请见谅。我通过 odbc 从 Access 数据库中导入了一个表:
df <- select(dbReadTable(accdb_path, name ="accdb_table"),"Col_1","Col_2","Col_3")
对于
> typeof(df$Col_3)
我明白了
[1] "list"
使用库(dplyr.teradata)。我将 blob 转换为字符串(可能已经在错误的路径上):
df$Hex <- blob_to_string(df$Col_3)
现在以一列(typeof = character)充满十六进制结束:
df[1,4]
[1] 49206765742061206c6f74206f662048657820616e642068617665207468652069737375652077697468207370656369616c2063687261637465727320696e204765726d616e206c616e6775616765206c696b65206e2b4150592d7
我的问题是,如何将 Col_3 中的每个值转换为正确的文本(如果可能,关于德语特殊字符,如 ü、ö、ä 和 ß)。
我知道这个解决方案How to convert a hex string to text in R?,但无法正确应用:
df$Text <- rawToChar(as.raw(strtoi(df$Hex, 16L)))
Fehler in rawToChar(as.raw(strtoi(BinData$Hex, 16L))) :
Zeichenkette '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
谢谢!
【问题讨论】:
你能解释一下为什么你需要dplyr.teradata
包吗?如果您直接查看该列表中的内容,例如df$Col_3[[1]]
?真的是一团吗?
感谢您的回复! df$Col_3[[1]]
给了我[1] 49 20 67 65 74 20 61 20 6c 6f 74 20 6f 66 20 48 65 78 20 61 6e 64 20 68 61 76 65 20 74 68 65 20 69 73 73 [49] 49 20 67 65 74 20 61 20 6c 6f 74 20 6f 66 20 48 65 78 20 61 6e 64 20 68 61 76 65 20 74 68 65 20 69 73 73 [97] ...
我不确定是否需要dplyr.teradata
包。
dplyr.teradata
似乎在这里没有做任何有用的事情......鉴于你分享的很少,它似乎折叠了那里找到的所有元素。所以...Col_3
第一行内的列表有很多这样的两个字符的字符串,看起来像十六进制值。但是转换它会给出数字......如果这有任何意义,很大程度上取决于您希望在数据库中找到什么。参见例如test <- c("49", "20", "67", "65", "74", "20", "61", "20", "6c", "6f")
strtoi(test, base = 16L)
再次感谢您的回答!我希望找到纯文本(这在某种程度上是明智的,这就是为什么我不能在这里完全复制它)。 rawToChar(as.raw(strtoi(df$Col_3[[1]],16L)))
给了我那个文本,但只针对第一个元素。我不知道如何使它适用于整个专栏(并将其转换为新专栏)。 df$Col_3
给我[1] blob[547 B]
。
哦,现在我明白了(我想)。请参阅下面的暂定答案。
【参考方案1】:
如果我理解正确的话,你想做什么来对列表的每个元素应用一个函数,以便它返回一个字符向量(如果你愿意,你可以将它添加到数据框)。
这可以通过purrr
系列函数轻松完成。下面获取每个元素 df$Col_3
并运行函数(每个元素都是给定函数中的 x)
purrr::map_chr(.x = df$Col_3,
.f = function(x) rawToChar(as.raw(strtoi(x,16L))))
您可能应该使用基本 R 函数实现相同的效果,例如 lapply()
后跟 unlist()
或 sapply()
,但使用 purrr
通常更容易找到不一致的结果。
【讨论】:
以上是关于将十六进制的列转换为R中的文本的主要内容,如果未能解决你的问题,请参考以下文章