2012-11-13 109 views
3

我正在尝试将二进制文件读入R,但是此文件具有以二进制代码写入的数据行。所以它没有一组属于一列的完整数据,而是存储为数据行。这里是我的数据是什么样子:将二进制文件读入R

字节1-4:INT ID 字节5:焦炭响应特性 字节6-9:INT RESP美元 字节10:char类型字符

有人能帮助我图怎么把这个文件读入R?

嗨,伙计们,

这是迄今为止尝试使用的代码。我尝试了一些有限的成功。不幸的是,我无法发布公共网站上的任何数据,并表示道歉。我对R来说比较新,所以我需要一些关于如何改进代码的帮助。提前致谢。

> binfile = file("File Location", "rb") 
> IDvals = readBin(binfile, integer(), size=4, endian = "little") 
> Responsevals = readBin(binfile, character(), size = 5) 
> ResponseDollarsvals = readBin (binfile, integer(), size = 9, endian= "little") 
Error in readBin(binfile, integer(), size = 9, endian = "little") : 
    size 9 is unknown on this machine 
> Typevals = readBin (binfile, character(), size=4) 
> binfile1= cbind(IDvals, Responsevals, ResponseDollarsvals, Typevals) 
> dimnames(binfile1)[[2]] 
[1] "IDvals"   "Responsevals"  "ResponseDollarsvals" "Typevals" 

> colnames(binfile1)=binfile 
Error in `colnames<-`(`*tmp*`, value = 4L) : 
    length of 'dimnames' [2] not equal to array extent 
+2

你可以发布数据文件的前几行吗? – Seth

+0

将它作为readBin的原始字节读取,并将其推入与文件相同的nrow矩阵中,然后将readBin从多组列中读入。它很快。这基本上为更复杂的格式,删除所有标题的东西和slurp了:http://stackoverflow.com/questions/12931979/reading-binary-files-in-r – mdsumner

+0

提供的文件,我会放在一起一个例子。 – mdsumner

回答

4

您可以打开文件作为原始文件,然后发出readBin或readChar命令来获取每一行。随时追加每个值到列中。

my.file <- file('path', 'rb') 

id <- integer(0) 
response <- character(0) 
... 

循环解决此块:

id = c(id, readBin(my.file, integer(), size = 4, endian = 'little')) 
response = c(response, readChar(my.file, 1)) 
... 
readChar(my.file, size = 1) # For UNIX newlines. Use size = 2 for Windows newlines. 

然后创建您的数据帧。

请看这里:http://www.ats.ucla.edu/stat/r/faq/read_binary.htm

+0

您好马修 - 我试图按照您的代码,但想知道如何确定我的文件是否有UNIX或Windows换行符?谢谢! – user1819654

+0

根据你编写文件的方式,你必须知道这些。您可以通过查看二进制数据来确定。如果您在UNIX系统上,则命令'od -t x1 '将打印字节值。作为行终止符的单个'0a'意味着UNIX行尾。一对,'0d'和'0a'是指Windows行尾。一个记录和下一个记录之间没有空格表示没有行结束,并且不应该使用额外的readChar()调用来吸取(不存在的)结束字符。 –

+0

马修 - 我想出了窗口行结束 - 最后一个问题 - 即时通讯尝试找出正确的字节大小输入我的响应美元列 - 每次我尝试输入字节大小 - 我不断收到一个错误说,大小在这台机器上是未知的 - 我尝试了以下字节大小 - 6,9,3,4,5 - 在此先感谢您的帮助 – user1819654