2013-04-19 27 views
18

Próbuję zautomatyzować ekstrakcję wielu plików skompresowanych za pomocą 7-zip. Muszę zautomatyzować ten proces, ponieważ: a) mam wiele lat danych, które chciałbym odblokować; b) Chciałbym udostępnić mój kod innym osobom i zapobiec ich ręcznemu powtarzaniu.jak programowo wyodrębnić lub rozpakować plik .7z (7-zip) za pomocą R

Mam zarówno WinRAR, jak i 7-zip zainstalowany na moim komputerze, i mogę samodzielnie otworzyć te pliki z dowolnym programem.

Rozejrzałem się po poleceniach unzipuntar i unz, ale nie wierzę, by któryś z nich zrobił to, czego potrzebuję.

Nie wiem nic na temat kompresji wiem, ale jeśli to robi jakąś różnicę: każdy z tych plików zawiera tylko jedenplik i to tylko plik tekstowy.

Zdecydowanie wolę rozwiązanie, które nie wymaga od użytkownika instalowania dodatkowego oprogramowania (takiego jak WinRAR lub 7-Zip) i wykonywania polecenia za pomocą shell, chociaż zdaję sobie sprawę, że to zadanie może być niemożliwe tylko w przypadku pakietów R i CRAN. Wierzę, że uruchamianie na tych plikach shell.exec z dodatkowymi parametrami może działać na komputerach z zainstalowanym WinRAR, ale znowu, chciałbym uniknąć tej instalacji, jeśli to możliwe. :)

Uruchomienie poniższego kodu spowoduje wczytanie plików, które próbuję wyodrębnić - pliki .7z w files.data są tym, co należy odblokować.

# create a temporary file and temporary directory, download the file, extract the file to the temporary directory 
tf <- tempfile() ; td <- tempdir() 
file.path <- "ftp://ftp.ibge.gov.br/Orcamentos_Familiares/Pesquisa_de_Orcamentos_Familiares_2008_2009/Microdados/Dados.zip" 
download.file(file.path , tf , mode = "wb") 
files.data <- unzip(tf , exdir = td) 

# how do i unzip ANY of these .7z files? 
files.data 

Dzięki! :)

+0

Najlepszym rozwiązaniem byłoby to pakiet, który może odczytywać i zapisywać pliki 7z przy użyciu standardowego API połączenia lub za pośrednictwem plików tymczasowych na dysku. Ale nie sądzę, że pakiet istnieje. – hadley

+1

uzgodnione. teraz składam petycję do brazylijskiego spisu ludności, aby śledzić rady @ dirk i ponownie publikować pliki w standardowym formacie :) dzięki hadley! –

+0

Przykładem twojego pokazu jest plik skompresowany pkzip, a nie skompresowany plik p7. Więc twoje standardowe 'unzip()' zadziała. Powiązane pytanie to http://stackoverflow.com/questions/31146263/sys-glob-within-unzip –

Odpowiedz

12

Jeśli masz 7z wykonywalnego w ścieżce, można proste użycie polecenia system

system('7z e -o <output_dir> <archive_name>')

+0

Całkowicie pomija wymaganie "Zdecydowanie wolę rozwiązanie, które nie wymaga od użytkownika instalowania dodatkowego oprogramowania". –

+0

@DirkEddelbuettel ale brak robienia wszystkiego ręcznie, to jedyna rzecz, która działa, prawda? :( –

+11

@DirkEddelbuettel ..z tego co ty i hadley mówią, to jest odpowiedź _only_. :(dlaczego miałbym usunąć wątek? Inni mogą również skorzystać z wiedzy, że to zadanie jest niemożliwe bez zainstalowania zewnętrznego oprogramowania –

8

Można to zrobić z archive package.

library(archive) 
tf <- tempfile() ; td <- tempdir() 
file.path <- "ftp://ftp.ibge.gov.br/Orcamentos_Familiares/Pesquisa_de_Orcamentos_Familiares_2008_2009/Microdados/Dados.zip" 
download.file(file.path , tf , mode = "wb") 
archive(tf) 

Zobacz https://github.com/jimhester/archive

+0

Niesamowite, zacznę odkładać od razu zależności 7-zip. https://github.com/ ajdamico/lodown/issues/99 thank you –

Powiązane problemy