【问题标题】:Filter files with patterns过滤带有模式的文件
【发布时间】:2021-08-07 14:31:44
【问题描述】:

我想从一个有很多文件的目录中读取几个文件。我发现第一个过滤器比较快,所以仍然只显示某些文件。

dir(
  path = "m:/"
  ,pattern = "bestand|bewegung\.dat|txt$"
)

结果我得到以下列表:

kosis_bewegung_01022018.txt
kosis_bewegung_01022018_fehlerliste.txt
kosis_bewegung_01022019.dat
kosis_bewegung_01022019_fehlerliste.dat
kosis_bestand_01022018.txt
kosis_bestand_01022018_fehlerliste.txt
kosis_bestand_01022019.dat
kosis_bestand_01022019_fehlerliste.dat

现在我还想隐藏包含“fehlerliste”的文件。

如何为此调整过滤器? 一步到位有可能吗?

【问题讨论】:

  • 尝试在. 之前选择一个数字 - 类似于pattern = "(bestand|bewegung).+\\d\\.(dat|txt)$"
  • 谢谢,这些模式符合我的需要!

标签: r regex


【解决方案1】:

我会这样做:

  1. bestand|bewegung\.dat|txt$获取文件名
  2. 删除包含fehlerliste的文件

使用dplyr 链接看起来更整洁:

library(dplyr)
files = grep(list.files(path = "m:/"),
             pattern = "bestand|bewegung\.dat|txt$", 
             value = TRUE)) %>%
        grep(list.files(path = "m:/"), 
             pattern = "fehlerliste", 
             invert = TRUE, value = TRUE))

如果你不想使用dplyr 那么:

files = grep(list.files(path = "m:/"), 
             pattern = "bestand|bewegung\.dat|txt$",
             value = TRUE))
files = grep(list.files(path = "m:/"),
             pattern = "fehlerliste",
             invert = TRUE, value = TRUE))

【讨论】:

    【解决方案2】:

    R 正则表达式支持negative lookahead assertions,所以以下应该可以工作:

    dir(
      path = "m:/"
      ,pattern = "^(?!.*fehlerliste).*(?:bestand|bewegung).*\.(?:dat|txt)$"
    )
    

    注意我用来隔离交替的非捕获组。否则,任何以txt 结尾的文件名都会匹配。

    说明:

    ^                     # Start of string
    (?!.*fehlerliste)     # Assert that "fehlerliste" doesn't occur in the string  
    .*                    # match any number of characters
    (?:bestand|bewegung)  # match "bestand" or "bewegung"
    .*                    # match any number of characters
    \.                    # match a dot
    (?:dat|txt)           # match "dat" or "txt"
    $                     # End of string
    

    【讨论】:

    • 我已经尝试过这个模式,但是 R 给我一个模式 (?!.*fehlerliste) 的错误。它说,这种模式是无效的。
    • 执行正则表达式时需要设置参数perl = TRUE,如grep("^(?!.*fehlerliste).*(?:bestand|bewegung).*\\.(?:dat|txt)$", subject, perl=TRUE)
    • 啊,就是这样!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多