2015-01-31 56 views
3

我正在使用unz从档案中的文件提取数据。这实际上工作得很好,但不幸的是我有很多zip文件,需要检查存档中特定文件的存在。如果存在或其他情况,我无法设法通过获得工作解决方案。检查存档中的文件是否存在(zip)

有没有人知道如何执行检查,如果一个文件中存在一个档案没有之前提取整个档案?

例子:

read.table(unz(D:/Data/Test.zip, "data.csv"), sep = ";")[-1,] 

这工作得很好,如果data.csv存在,但如果该文件是在存档中不Test.zip可以给出一个错误。

Error in open.connection(file, "rt") : cannot open the connection 
In addition: Warning message: 
In open.connection(file, "rt") : 
    cannot locate file 'data.csv' in zip file 'D:/Data/Test.zip' 

欢迎任何评论!

+0

你可以得到zip文件的列表,而不需要用'unzip(file.zip,list = TRUE)'解压缩它' – 2015-01-31 17:44:59

+0

感谢您的快速回答!我会检查我的代码并留言。 – kukuk1de 2015-01-31 17:46:59

回答

7

您可以使用unzip(file, list = TRUE)$Name获取zip文件的名称,而无需解压缩。然后你可以检查你需要的文件是否在列表中。

## character vector of all file names in the zip 
fileNames <- unzip("D:/Data/Test.zip", list = TRUE)$Name 

## check if any of those are 'data.csv' (or others) 
check <- basename(fileNames) %in% "data.csv" 

## extract only the matching files 
if(any(check)) { 
    unzip("D:/Data/Test.zip", files = fileNames[check], junkpaths = TRUE) 
} 

你也许可以换一种说法if()运行的情况下unz()那里只有一个匹配的文件名,因为它不是一个单一的文件运行unzip()更快。

+1

感谢您对先前评论的扩展代码。这工作得很好!我想我不需要另一个if(),因为zip文件中的名称是唯一的。所以我可以直接在档案中运行unz(),如果文件可用,这似乎很快。再次感谢! – kukuk1de 2015-01-31 19:01:39