列出与R中的完整路径模式匹配的所有文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列出与R中的完整路径模式匹配的所有文件相关的知识,希望对你有一定的参考价值。
我试图获取匹配全路径模式的文件列表。到目前为止,我已经使用了list.files()但它没有用。
我们假设我们有以下目录组织:
results
|- A
| |- data-1.csv
| |- data-2.csv
|
|- B
|- data-1.csv
|- data-2.csv
然后是以下命令:
list.files(pattern='data-.*\.csv', recursive=TRUE)
将返回与模式匹配的所有文件。这有效,但使用完整路径模式时会出现问题。例如,如果我想从目录结果/ A中获取所有CSV文件,我可以这样做:
list.files(pattern='results/A/data-.*\.csv', recursive=TRUE)
但这不起作用。不知何故,似乎R无法使用全路径模式作为正则表达式。在这种情况下,解决方案可能只是使用结果/ A作为基本路径。但在更复杂的问题中,这是不可能完成的。例如,在某些时候,我们可能希望匹配仅包含字符的子目录:
list.files(pattern='results/[A-Z]+/data-.*\.csv', recursive=TRUE)
可以在R中这样做吗?
更新:在使用临时解决方案一段时间后,我决定一次又一次地停止输入相同的内容。所以,我创建了一个library来简化这项任务。
答案
首先,请注意您没有使用正则表达式模式。你的第一个例子应该是:
list.files(pattern='data-.*\.csv', recursive=TRUE)
然后,似乎list.files
中的模式匹配应用于文件基本名称(即,不包括目录路径),因此您可以将任务拆分为:
- 查找仅与基本名称匹配的所有文件,返回其完整路径:
basename.matches <- list.files(pattern='data-.*\.csv', recursive=TRUE, full.names = TRUE) basename.matches # [1] "./results/A/data-1.csv" "./results/A/data-2.csv" "./results/B/data-1.csv" # [4] "./results/B/data-2.csv"
- 仅保留与预期目录匹配的那些:
full.matches <- grep(pattern='^\./results/A/', basename.matches, value = TRUE) full.matches # [1] "./results/A/data-1.csv" "./results/A/data-2.csv"
另一答案
你不能仅使用list.files
来做这件事,因为它遍历path
中的每个元素并将正则表达式应用于其中包含的文件。但由于path
对list.files
的论证可以接受一个向量,你可以用它来解决你的问题。
dirs <- grep("[A-Z]+$",list.dirs("results",recursive=FALSE),value=TRUE)
list.files(dirs, "data-.*\.csv", recursive=TRUE, full.names=TRUE)
另一答案
我认为有一个更简单的解决方案:
Sys.glob(file.path(results, "[A-Z]", "data-*.csv"))
另一答案
我会用的
paths <- list.files(results, pattern= glob2rx("*data-*.csv$*"), full.names=T, recursive=T)
以上是关于列出与R中的完整路径模式匹配的所有文件的主要内容,如果未能解决你的问题,请参考以下文章