You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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这种带三位前导零的格式。

问题原因

  1. pattern参数不支持向量:list.files()的pattern只能接受单个正则表达式字符串,传向量根本没法实现多文件匹配。
  2. 正则表达式写错了:生成的"\\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:27:28