我有一个370MB的zip文件,内容是一个4.2GB的csv文件。
我做了:
unzip("year2015.zip", exdir = "csv_folder")
我收到了这条消息:
1: In unzip("year2015.zip", exdir = "csv_folder") :
possible truncation of >= 4GB file
你以前经历过吗?你是怎么解决的?
答案 0 :(得分:5)
检查Note
,在{{1}}中找到以下评论:
它确实支持bzip2压缩和> 2GB zip文件 (但不包括zip文件中包含的> = 4GB文件预压缩:喜欢 解压缩它的许多版本可能会截断这些,在R的情况下会发出警告 如果可能的话。)
您可以尝试将其解压缩到R之外(例如,使用7-Zip)。
答案 1 :(得分:5)
我同意@Sixiang.Hu的回答,R&#39的解压缩()在大于4GB的文件下无法可靠地工作。
要获得你是如何解决它的?:我已经尝试了一些不同的技巧,根据我的经验,任何使用R&#39内置插件的结果在文件的实际结束之前(几乎)总是不正确地识别文件结束(EOF)标记。
我在每晚处理的一组文件中处理这个问题,为了一致地以自动方式处理它,我将下面的函数编写为解压UNIX解压缩。这基本上就是你在系统中所做的事情(unzip()),但是它给你的行为提供了更多的灵活性,并允许你更系统地检查错误。
decompress_file <- function(directory, file, .file_cache = FALSE) {
if (.file_cache == TRUE) {
print("decompression skipped")
} else {
# Set working directory for decompression
# simplifies unzip directory location behavior
wd <- getwd()
setwd(directory)
# Run decompression
decompression <-
system2("unzip",
args = c("-o", # include override flag
file),
stdout = TRUE)
# uncomment to delete archive once decompressed
# file.remove(file)
# Reset working directory
setwd(wd); rm(wd)
# Test for success criteria
# change the search depending on
# your implementation
if (grepl("Warning message", tail(decompression, 1))) {
print(decompression)
}
}
}
注意:
该功能做了一些我喜欢和推荐的事情:
system2
而不是系统,因为the documentation说&#34; system2是一个比系统更便携,更灵活的界面&#34; directory
和file
参数,并将工作目录移动到directory
参数;取决于你的系统,解压缩(或你选择的解压缩工具)在解压缩工作目录之外的档案时变得非常挑剔
.file_cache
参数,允许您跳过解压缩
if
+ grepl
检查在stdout中查找警告,如果找到该表达式则打印stdout 答案 2 :(得分:0)
要添加到可能的解决方案列表中,如果您的计算机上有Java(JDK),则可以将jar xf
包装到类似于utils::unzip()
接口的R函数中,这非常简单例如:
unzipLarge <- function(zipfile, exdir = getwd()) {
oldWd <- getwd()
on.exit(setwd(oldWd))
setwd(exdir)
system2("jar", args = c("xf", zipfile))
}
然后使用:
unzipLarge("year2015.zip", exdir = "csv_folder")