如何在 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中读取 .dat 二进制文件(深度图)

matlab如何批量读取带有编号的文件

请问python中如何读取一个csv或者dat文件,并储存为一个二维数组?

qt读取文件内容全部为浮点数的二进制文件

C++如何将一个存有数据的文本文件转换为二进制文件?

matlab读12bit数据