R:解压缩大型压缩.csv产生"zip file is corrupt"警告



我正在从联合国粮农组织下载一个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,此页面显示调用的结构

您还可以使用systemshell从 R 运行命令行(这只是system的包装器

要提取的命令行常规结构为:

winzip32 -e [options] filename[.zip] folder

因此,我们创建一个具有此结构和输入路径的字符串,并围绕它创建一个函数,该函数使用参数zipfileexdir模仿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:使用完整路径! 命令行不知道您的工作目录(如果需要,我们可以在我们的函数中实现该功能(。

最新更新