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 仅对该文件的操作。
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 仅对该文件的操作。