Mam spakowany plik binarny w systemie operacyjnym Windows, który próbuję odczytać za pomocą R. Do tej pory działa przy użyciu unz() funkcja w połączeniu z funkcją readBin().Odczytuj pliki binarne w R z pliku zip i znaną pozycję początkową (przesunięcie bajtowe)
> bin.con <- unz(zip_path, file_in_zip, open = 'rb')
> readBin(bin.con,
"double",
n = byte_chunk,
size = 8L,
endian = "little")
> close(bin.con)
Gdzie zip_path jest ścieżką do pliku zip, file_in_zip jest nazwa pliku w pliku zip, który ma być odczytany i byte_chunk liczbę bajtów, które chcę przeczytać.
W moim przypadku użycia, operacja readBin jest częścią pętli i stopniowo odczytuje cały plik binarny. Jednak rzadko chcę czytać wszystko i często dokładnie wiem, które części chcę przeczytać. Niestety, readBin nie ma argumentu start/skip, aby pominąć pierwsze n bajtów. Dlatego próbowałem warunkowo zastąpić readBin() przez seek(), aby pominąć faktyczny odczyt niechcianych części.
Kiedy próbuję to pojawia się błąd:
> 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)
Do tej pory nie mogę znaleźć sposobu, aby rozwiązać ten problem. Podobne pytania można znaleźć tutaj (niestety bez satysfakcjonującej odpowiedzi):
- https://stat.ethz.ch/pipermail/r-help/2007-December/148847.html (brak odpowiedzi)
- http://r.789695.n4.nabble.com/reading-file-in-zip-archive-td4631853.html (brak odpowiedzi, ale powtarzalne przykład)
Porady całym internecie sugerują dodanie Argument open = 'r' do unz() lub całkowite odrzucenie otwartego argumentu, ale działa tylko w przypadku plików innych niż binarne (ponieważ domyślnie jest to "r"). Ludzie sugerują najpierw rozpakowanie plików, ale ponieważ pliki są dość duże, jest to praktycznie niemożliwe.
Czy jest jakieś obejście w poszukiwaniu binarnego spakowanego pliku lub odczytu z offsetem bajtowym (potencjalnie przy użyciu C++ za pośrednictwem pakietu Rcpp)?
Aktualizacja:
Dalsze badania zdają się wskazywać, że seek() w plikach zip nie jest łatwym problemem. sugeruje bibliotekę C++, która w najlepszym przypadku może posłużyć się szukaniem zgrubnym. This Python question oznacza, że dokładne wyszukiwanie jest całkowicie niemożliwe ze względu na sposób implementacji zip (chociaż nie jest to sprzeczne z metodą poszukiwania zgrubnego).
w dokumentacji dla "seek", mówi, że korzystanie z funkcji wyszukiwania w systemie Windows jest odradzane, więc należy ostrzec. tylko ciekawe pytanie: w jaki sposób tworzony jest ten plik? masz kontrolę nad tym, jak jest tworzony? – chinsoon12
Czy chcesz wziąć pod uwagę inne języki? To wydaje się problemem dla języków takich jak C/C++/Java. zobacz ten http://www.phillipciske.com/blog/index.cfm/2008/10/2/Reading-Binary-Files-in-a-Zip-File- Before-CF8 – chinsoon12
@ chinsoon12, źródło tego błędu jest wątpliwy, jak wspomniano tutaj: http://stackoverflow.com/questions/32736845/is-seek-reliable-on-modern-windows/32737017 Odpowiedź na twoje drugie pytanie jest negatywna. Nie tworzę pliku, ponieważ jest on tworzony przez narzędzie innej firmy. – takje