R语言list.files按指定向量匹配CSV文件的正则表达式问题及解决
搞定list.files()匹配指定CSV文件失效的问题
问题场景
我在RStudio里想用一个动态更新的数值向量threshold_list批量导入指定CSV文件,写了这段代码:
test_list <- list.files( path='~/somepath/' , pattern = paste0(threshold_list, "\\.csv$") , recursive = TRUE , full.names = TRUE)
threshold_list是像1,2,3,...,150这样的整数向量,打印paste0(threshold_list, "\\.csv$")能得到预期的文件名模式,但传到list.files()的pattern参数后,只匹配到了间隔10的文件(比如001.csv、011.csv...),不是我要的所有指定文件。后来发现实际文件名是001.csv、002.csv这种带三位前导零的格式。
问题原因
pattern参数不支持向量:list.files()的pattern只能接受单个正则表达式字符串,传向量根本没法实现多文件匹配。- 正则表达式写错了:生成的
"\\1.csv$"是正则里的反向引用(用来引用之前捕获的内容),不是匹配"1.csv";而且文件名是三位带零的,直接用数字1肯定匹配不到001.csv。
解决方案
办法1:生成正确的正则表达式
先把数值转成带前导零的文件名格式,再拼成正则的多选分支:
# 把数字转成三位带零的文件名,比如1→001.csv target_filenames <- sprintf("%03d.csv", threshold_list) # 拼成正则:^(001.csv|002.csv|...)$,这样就能匹配所有指定文件 pattern <- paste0("^(", paste(target_filenames, collapse = "|"), ")$") # 再调用list.files test_list <- list.files( path = "~/somepath/", pattern = pattern, recursive = TRUE, full.names = TRUE )
办法2:直接生成路径找文件
不用正则,直接生成所有目标文件的完整路径,挑出实际存在的:
# 生成所有目标文件的完整路径 target_paths <- file.path("~/somepath/", sprintf("%03d.csv", threshold_list)) # 只保留存在的文件 test_list <- target_paths[file.exists(target_paths)]
补充说明
办法2更简单直接,不用纠结正则的问题,适合文件名格式固定的情况;办法1适合需要递归查找或者文件名规则更复杂的场景。
内容的提问来源于stack exchange,提问作者scooptywoopty
相关产品推荐
相关产品推荐

