如何在 R 中读取 .dat 文件中的二进制数据?使用 readBin 时出错
Posted
技术标签:
【中文标题】如何在 R 中读取 .dat 文件中的二进制数据?使用 readBin 时出错【英文标题】:How to read binary data in .dat file in R? Got errors using readBin 【发布时间】:2020-10-09 14:48:39 【问题描述】:我有一个大的 .dat 文件 (30GB),里面是二进制文件,因为当我使用文本编辑器打开它时,我无法立即看到任何有意义的内容。我对每一列都有具体的定义,应该是超过 900 列和 30,000,000 行。所有列名和值都定义为具有不同长度的字符。这是我在尝试 readBin 函数时收到的警告:
df = readBin(bdata, character(), n = 10)
警告信息: 1:在 readBin(bdata, character(), n = 10) 中: 未找到空终止符:在 10000 字节处中断字符串
df 给了我这个:
023756063201056576593012004003012008005000009844000011000000011730000012716000013583000014110000014905000015775000016965000018575000012605000012792000018083000013263000013468000020182000021175000021117000014673000014780000022961000023733000016561000015848000034450000034450000034450000034450000034450000034150000034150000034150000037386000037386000024150000024050000034050000024050000025550000035550000035550000035550000025850000025050000035050000035050000025050000025250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000311000000258000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000042800000043530000043560000043840000043130000040000000040420000039990000040210000039910000 03945000003954000003937000003979000003922000003970000003972000003957000003975000003959000004066000003939000003975000004018000004300000004300000004300000004300000004300000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 P>
...
这不是我应该看到的。请指教。谢谢。
【问题讨论】:
这看起来不像二进制数据,它看起来像 ascii 数字。readLines(bdata, 3)
给你什么?我的猜测是你想使用read.fwf()
,但列宽是多少并不明显。
您可能还想发布您的 900 个列定义中的前几个,以便我们了解您正在处理的内容。
readlines方法(BDATA,1)给我:[1]“001890848101040570628004000004004000000000000133000000176000000218000000260000000301000000342000000382000000422000000463000000500000000089000000132000000176000000218000000260000000301000000342000000382000000422000000461-00000002-00000002-00000002 -.......前几列定义是:Format:长度:开始排名: End Pos: char 10 1 10 char 2 11 12 char 3 13 15 char 3 16 18 char 3 19 21 char 3 22 24 char 3 25 27 char 3 28 30 抱歉,我无法共享列名的定义。谢谢!
前几列的宽度(都是char):10, 2, 3, 3, 3, 3, 3, 3
是ascii数字,我用r中的一些函数检查过
【参考方案1】:
如果只有 8 列,这将读取它的开头。您需要根据您的文档填写其余部分:
read.fwf(bdata, widths = c(10, 2, 3, 3, 3, 3, 3, 3),
col.names = c("Col1", "Col2", ...), # Use the actual names
n = 3) # Limit to reading 3 lines until you've got it right, then
# remove n = 3 to read the whole file
【讨论】:
问题解决了!这确实是一个固定宽度的文件,我使用了 read.fwf 并声明了宽度,并且数据文件被正确读取!非常感谢!!!!以上是关于如何在 R 中读取 .dat 文件中的二进制数据?使用 readBin 时出错的主要内容,如果未能解决你的问题,请参考以下文章