列出与R中的完整路径模式匹配的所有文件

bet*_*ido 25 regex r path

我试图获取匹配全路径模式的文件列表.到目前为止,我已经使用了list.files()但它没有用.

我们假设我们有以下目录组织:

results
   |- A
   |  |- data-1.csv
   |  |- data-2.csv
   |
   |- B
      |- data-1.csv
      |- data-2.csv
Run Code Online (Sandbox Code Playgroud)

然后是以下命令:

list.files(pattern='data-.*\\.csv', recursive=TRUE)
Run Code Online (Sandbox Code Playgroud)

将返回与模式匹配的所有文件.这有效,但使用完整路径模式时会出现问题.例如,如果我想从目录结果/ A中获取所有CSV文件,我可以这样做:

list.files(pattern='results/A/data-.*\\.csv', recursive=TRUE)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.不知何故,似乎R无法使用全路径模式作为正则表达式.在这种情况下,解决方案可能只是使用结果/ A作为基本路径.但在更复杂的问题中,这是不可能完成的.例如,在某些时候,我们可能希望匹配仅包含字符的子目录:

list.files(pattern='results/[A-Z]+/data-.*\\.csv', recursive=TRUE)
Run Code Online (Sandbox Code Playgroud)

可以在R中这样做吗?

更新:在使用临时解决方案一段时间后,我决定一次又一次地停止输入相同的内容.因此,我创建了一个用于简化此任务的.

flo*_*del 32

首先,请注意您没有使用正则表达式模式.你的第一个例子应该是:

list.files(pattern='data-.*\\.csv', recursive=TRUE)
Run Code Online (Sandbox Code Playgroud)

然后,似乎里面的模式匹配list.files 应用于文件基本名称(即,不包括目录路径),因此您可以将任务拆分为:

  1. 查找仅与基本名称匹配的所有文件,返回其完整路径:

    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"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 仅保留与预期目录匹配的那些:

    full.matches <- grep(pattern='^\\./results/A/', basename.matches, value = TRUE)
    full.matches
    # [1] "./results/A/data-1.csv" "./results/A/data-2.csv"
    
    Run Code Online (Sandbox Code Playgroud)


Jos*_*ich 7

你不能这样做只是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)
Run Code Online (Sandbox Code Playgroud)