我在Windows操作系统下有一个压缩的二进制文件,我试图用R读取。到目前为止,它使用unz()函数结合readBin()函数。从压缩文件和已知起始位置读取R中的二进制文件(字节偏移量)
> bin.con <- unz(zip_path, file_in_zip, open = 'rb')
> readBin(bin.con,
"double",
n = byte_chunk,
size = 8L,
endian = "little")
> close(bin.con)
凡zip_path是路径zip文件,file_in_zip是zip文件将被读取并byte_chunk,我想读取的字节数内的文件名。
在我的用例中,readBin操作是循环的一部分,并逐渐读取整个二进制文件。但是,我很少想要阅读所有内容,并且经常知道我要阅读哪些部分。不幸的是,readBin没有启动/跳过参数来跳过前n个字节。因此,我试图有条件地用seek()替换readBin(),以便跳过实际读取不需要的部分。
当我尝试,我得到一个错误:
> bin.con <- unz(zip_path, file_in_zip, open = 'rb')
> seek(bin.con, where = bytes_to_skip, origin = 'current')
Error in seek.connection(bin.con, where = bytes_to_skip, origin = "current") :
seek not enabled for this connection
> close(bin.con)
到目前为止,我没有找到一个方法来解决这个错误。类似的问题都可以在这里找到(可惜没有一个满意的答案):
- https://stat.ethz.ch/pipermail/r-help/2007-December/148847.html(无答案)
- http://r.789695.n4.nabble.com/reading-file-in-zip-archive-td4631853.html(没有答案,但重复的例子)
提示所有在互联网上建议增加打开='r'参数到unz()或完全放弃open参数,但只适用于非二进制文件(因为默认值为'r')。人们还建议首先解压缩文件,但由于文件相当大,这实际上是不可能的。
是否有任何解决方法寻找二进制压缩文件或读取字节偏移量(可能使用C++通过Rcpp包)?
更新:
进一步的研究似乎表明,寻求()在zip文件不是一个简单的问题。 建议一个C++库,最多可以使用粗略搜索。 This Python question表示由于zip的实现方式(尽管它与粗略搜索方法不矛盾),精确查找是完全不可能的。
在'seek'的文档中,它表示不鼓励在Windows上使用seek,所以要警告。只是一个奇怪的问题:这个文件是如何创建的?你有控制它是如何创建的? – chinsoon12
你是否愿意考虑其他语言?这似乎是像C/C++/Java这样的语言的问题。看到这个http://www.phillipciske.com/blog/index.cfm/2008/10/2/Reading-Binary-Files-in-a-Zip-File-Before-CF8 – chinsoon12
@ chinsoon12,该错误的起源是可疑的,因为在这里提到:http://stackoverflow.com/questions/32736845/is-seek-reliable-on-modern-windows/32737017你的第二个问题的答案是否定的。我不创建该文件,因为它是由第三方工具创建的。 – takje