我正在从联合国粮农组织下载一个78MB的zip文件,其中包含一个2.66GB csv。我能够使用 winzip 从文件夹中解压缩下载的文件,但无法使用 R 中的unzip()
解压缩文件:
警告 - 78MB 下载!
url <- "http://fenixservices.fao.org/faostat/static/bulkdownloads/FoodBalanceSheets_E_All_Data_(Normalized).zip"
path <- file.path(getwd(),"/zipped_data.zip")
download.file(url, path, mode = "wb")
unzipped_data <- unzip(path)
这会导致警告和解压缩文件失败:
警告消息
在解压缩(路径(:zip文件已损坏
在我看到的?unzip
文档中
"它确实对bzip2压缩和>2GB zip文件有一些支持(但不是>= 4GB文件预压缩包含在zip文件中:像许多解压缩版本一样,它可能会截断这些,在R的情况下,如果可能的话,会发出警告(">
这让我相信unzip()
应该处理我的文件,但同样的过程已经成功地从粮农组织统计数据库下载、解压缩和读取了多个其他较小的表格。我的csv的大小是否有可能是此错误的根源?如果是这样,解决方法是什么?
我在 Ubuntu Server 20.04 上运行unzip()
时遇到了同样的问题。设置参数unzip(..., unzip = "/usr/bin/unzip")
,而不是unzip = "internal"
,起到了作用。
我无法测试我的解决方案,这也取决于您的安装,但希望这会起作用或至少为您指出合适的解决方案:
您可以通过命令行运行winzip,此页面显示调用的结构
您还可以使用system
或shell
从 R 运行命令行(这只是system
的包装器
要提取的命令行常规结构为:
winzip32 -e [options] filename[.zip] folder
因此,我们创建一个具有此结构和输入路径的字符串,并围绕它创建一个函数,该函数使用参数zipfile
和exdir
模仿unzip
unzip_wz <- function(zipfile,exdir){
dir.create(exdir,recursive = FALSE,showWarnings=FALSE) # I don't know how/if unzip creates folders, you might want to tweak or remove this line altogether
str1 <- sprintf("winzip32 -e '%s' '%s'",zipfile,exdir)
shell(str1,wait = TRUE) # set to FALSE if you want the program to keep running while unzipping, proceed with caution but in some cases that could be an improvement of your current solution
}
您可以尝试使用此函数代替unzip
。它假设 winzip32 已添加到您的系统路径变量中,如果不是,请添加它,或将其替换为 exec 全名,以便您得到类似以下内容:
str1 <- sprintf("'C://probably/somewhere/in/program/files/winzip32.exe' -e '%s' '%s'",zipfile,exdir)
PS:使用完整路径! 命令行不知道您的工作目录(如果需要,我们可以在我们的函数中实现该功能(。