我想从一个有很多文件的目录中读取几个文件。我相对较快地找到了第一个过滤器,因此只有某些文件仍然显示。
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";。
我必须如何为此调整我的过滤器?一步到位可能吗?
R正则表达式支持负前瞻断言,因此以下内容应该有效:
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
我会这样做:
- 使用
bestand|bewegung.dat|txt$
获取文件名 - 清除包含
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))