将十六进制的列转换为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 &lt;- 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中的文本的主要内容,如果未能解决你的问题,请参考以下文章

在R中将十六进制转换为十进制

将邻接列表转换为 R 中的二进制矩阵

如何将两列“计数”矩阵转换为 R 中的二进制向量? [复制]

无法将带有字符串的文本文件转换为 R 中每行一个字符的列

R语言 二进制文件

如何将对象类型的列转换为 HexaDecimal