Sys.glob()内解压()

Sys.glob () within unzip ()

TLDNR:如何在 unzip () 中使用 Sys.glob ()?

我有多个 .zip 文件,我只想从每个存档中提取一个文件。

例如,其中一个档案包含以下文件:

[1] "cmc-20150531.xml"     "cmc-20150531.xsd"     "cmc-20150531_cal.xml" "cmc-20150531_def.xml" "cmc-20150531_lab.xml"
[6] "cmc-20150531_pre.xml"

我想提取第一个文件,因为它与模式匹配。为此,我使用以下命令:

unzip("zip-archive.zip", files=Sys.glob("[a-z][a-z][a-z][-][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][.][x][m][l]"))

但是,命令不起作用,我不知道为什么。 R 只是提取存档中的所有文件。

另一方面,以下命令有效:

unzip("zip-archive.zip", files="cmc-20150531.xml")

如何在 unzip() 中使用 Sys.glob()?

Sys.glob 扩展已经存在的文件。因此,您的 unzip 调用的参数将取决于您的工作目录中的文件。

也许您想先用 list=TRUE 对 return zip 中的文件列表进行 unzip,然后对 select 文件使用一些模式匹配你要。

有关使用模式匹配字符串的信息,请参阅 ?grep。这些模式是 "regular expressions" 而不是 "glob" 扩展,但你应该能够使用它。

这是一个具体的例子:

# whats in the zip?
files = unzip("c.zip", list=TRUE)$Name
files
[1] "l_spatial.dbf"    "l_spatial.shp"    "l_spatial.shx"    "ls_polys_bin.dbf"
[5] "ls_polys_bin.shp" "ls_polys_bin.shx" "rast_jan90.tif"  

# what files have "dbf" in them:
files[grepl("dbf",files)]
[1] "l_spatial.dbf"    "ls_polys_bin.dbf"

# extract just those:
unzip("c.zip", files=files[grepl("dbf",files)])

glob 的正则表达式

 "[a-z][a-z][a-z][-][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][.][x][m][l]"

会是

 "^[a-z]{3}-[0-9]{8}\.xml$"

匹配字符串开头 ("^")、3 a-z(仅限小写)、破折号、八位数字、一个点(需要反斜杠,一个是因为点在正则表达式中表示 "any one char"另一个是因为 R 需要一个反斜杠来转义一个反斜杠),"xml",以及字符串的结尾(“$”)。

只需与任何其他集合一起对 Sys.glob 的结果进行迭代循环,并提供迭代保持变量以进行解压缩。这是通过使用 for-loop

实现的

虽然 unzip() 接受路径参数,而 files 是该 zip 文件中的文件的参数。

我是一个全栈程序员,而不是 R 语言,但概念是相同的;所以代码应该是这样的:

files <- Sys.glob(path_expand(".","*.zip"))
for (idx in 1:length(files)) {
    results = unzip(files[idx], "*.xml")
}

至于在 unzip() 中使用正则表达式,您应该阅读文档。我只能建议做另一个 for-loop 来比较 zip 文件与您的正则表达式的竞争,然后执行提取。伪代码如下:

files ::= glob(*.zip)
regex ::= 
for idx1 in length(files); do
  regex="[a-z]{3}\-[0-9]{8}\.xml"
  content = unzip(files[idx1])
  for idx2 in length(content); do
    if content[idx2].name ~= regex.expand(); then
      # do something with found file
    end if
  end for
end for

基本上你只是循环遍历你的 zip 文件列表,然后遍历 zip 文件中的文件列表并比较你的 zip 文件中的文件名 agenst 正则表达式和 extracting/preforming 仅对该文件的操作。