如何使用R编程语言程序化地提取/解压.7z(7-zip)文件

38

我正在尝试自动提取用7-zip压缩的多个文件。我需要自动化此过程,因为a)有许多年的数据我想解锁,b)我想与他人分享我的代码并防止他们手动重复此过程。

我在计算机上都安装了WinRAR和7-zip,并且我可以使用任一程序轻松地单独打开这些文件。

我查看了unzipuntarunz命令,但我不认为它们中的任何一个都能满足我的需求。

关于压缩,我一无所知,但如果有区别的话:每个文件都只包含一个文件,而且它仅仅是一个文本文件。

我非常希望有一个不需要用户安装其他软件(如WinRAR或7-Zip)并执行带有shell的命令的解决方案,尽管我承认这可能是不可能只用R和CRAN包完成的任务。事实上,我认为在安装了WinRAR的计算机上,通过对这些文件使用附加参数运行shell.exec可能会起作用,但再次强调,如果可能的话,我想避免那种安装。 :)

运行下面的代码将加载我正在尝试提取的文件-- files.data中的.7z文件需要解锁。

# 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

谢谢!!! :)


最好的解决方案将是一个包,它可以使用标准连接API或通过磁盘上的临时文件读取和写入7z文件。但我认为这样的包并不存在。 - hadley
1
同意。现在我正在向巴西人口普查的工作人员请愿,遵循@dirk的建议并重新发布具有标准格式的文件 :) 谢谢Hadley! - Anthony Damico
你展示的例子是一个PKZIP压缩文件,而不是P7压缩文件。因此,您的标准“unzip()”将起作用。相关问题请参考http://stackoverflow.com/questions/31146263/sys-glob-within-unzip。 - Dwight Spencer
2个回答

33

这可以使用archive完成。

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)

请查看https://github.com/jimhester/archive


3
太棒了。我会立即开始卸载7-zip的依赖项。感谢您提供的链接。 - Anthony Damico
3
用于解压的archive_extract. - chan1142
1
谢谢!对于压缩,archive_write_dir() 的效果非常好。 - Yeoman

26
如果您的路径中有可执行文件 7z,您可以简单地使用 system 命令: system('7z e -o <output_dir> <archive_name>')

3
完全未达到“我强烈希望解决方案不需要用户安装额外软件”的要求。 - Dirk Eddelbuettel
@DirkEddelbuettel 但除了手动操作,这是唯一可行的方法,对吧?:( - Anthony Damico
17
@DirkEddelbuettel..根据你和Hadley的说法,这是唯一的答案。 :( 为什么我要删除这个帖子呢?其他人可能也会受益于知道执行此任务必须安装外部软件是不可能的。 - Anthony Damico
6
请注意,命令是 system('7z e -o<output_dir> <archive_name>')。如果在“-o”和目录之间加上空格,它将失败! - 576i

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接