如何修改R语言list.files规则,筛选含Weekly和grocery的CSV文件
如何用R筛选同时包含Weekly和grocery的CSV文件名?
我有一个存满CSV文件的文件夹,需要提取同时包含Weekly和grocery的文件名列表。示例文件名如下:
03_27_2023_Weekly_01_07_2018_grocery.csv 03_27_2023_Weekly_01_14_2018_stationary.csv 03_27_2023_Biweekly_01_07_2018_grocery.csv 03_27_2023_Biweekly_01_21_2018_grocery.csv 03_27_2023_Biweekly_01_07_2018_stationary.csv 03_27_2023_Biweekly_01_21_2018_stationary.csv
目前我用以下代码只能筛选出包含grocery的文件,请问怎么修改pattern参数来同时匹配两个关键词?
list.files(path = path[["files"]], # 文件所在文件夹路径 pattern = "_grocery.csv", # 需要修改的匹配规则 full.names = TRUE)
解决方案
通用写法(不限制Weekly和grocery的顺序)
使用正则表达式的正向预查,确保两个关键词都存在,需要开启Perl兼容模式:
list.files(path = path[["files"]], pattern = "^(?=.*Weekly)(?=.*_grocery\\.csv).*$", full.names = TRUE, perl = TRUE)
(?=.*Weekly):检查文件名中是否包含Weekly(?=.*_grocery\\.csv):检查文件名是否以_grocery.csv结尾(正则里.是特殊字符,需要用\\转义)perl = TRUE:R默认正则不支持正向预查,必须开启这个参数才能生效
简化写法(已知Weekly在grocery前面)
如果确定文件名里Weekly一定出现在grocery相关内容的前面,可以用更简单的正则,不需要开启Perl模式:
list.files(path = path[["files"]], pattern = "Weekly.*_grocery\\.csv", full.names = TRUE)
这个规则会匹配所有包含Weekly,且后面跟着任意内容、最终以_grocery.csv结尾的文件名。
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

