我在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