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

R语言如何根据CSV表条件筛选指定文件并完成跨目录复制?

原代码运行失败的核心原因
  • 列名引用错误:CSV内存储待匹配文件名的列为File Name,原代码错误引用了不存在的Move列,直接导致匹配池为空
  • 源文件路径缺失:list.files()默认仅返回文件名,不拼接源目录完整路径,调用file.copy()时会因为找不到文件位置报错
  • 匹配逻辑未考虑文件后缀:CSV内存储的是无后缀的文件名(如CA-001),源目录下实际文件为带.pdf后缀的格式,直接做全字符串匹配无法命中
  • 未做异常校验:没有提前判断匹配结果、目标目录是否存在,出错后无法快速定位问题
可直接运行的正确代码
# 基础路径配置
source_dir <- "C:/Users/53038/MovePDF/Test_From"
target_dir <- "C:/Users/53038/MovePDF/Test_To"
csv_path <- "C:/Users/53038/MovePDF/Master.csv"

# 自动创建目标目录(如果不存在)
dir.create(target_dir, recursive = TRUE, showWarnings = FALSE)

# 读取CSV内的待匹配文件名,自动去除首尾多余空格
csv_file <- read.csv(csv_path, stringsAsFactors = FALSE)
target_name_list <- trimws(csv_file$`File Name`)

# 获取源目录下所有文件的完整路径、纯文件名(去后缀)
all_files_fullpath <- list.files(path = source_dir, full.names = TRUE)
all_files_name <- tools::file_path_sans_ext(basename(all_files_fullpath))

# 匹配待复制文件
match_flag <- all_files_name %in% target_name_list
to_copy_files <- all_files_fullpath[match_flag]

# 输出未找到的文件提示,方便排查
miss_files <- setdiff(target_name_list, all_files_name)
if (length(miss_files) > 0) {
  warning(paste0("源目录内未找到以下列表内文件:", paste(miss_files, collapse = "、")))
}

# 执行复制操作,默认不覆盖已存在文件
copy_result <- file.copy(from = to_copy_files, to = target_dir, overwrite = FALSE)
message(paste0("执行完成:共成功复制", sum(copy_result), "个文件,失败", length(copy_result)-sum(copy_result), "个文件"))
适配调整说明
  • 如果CSV内存储的文件名本身带.pdf后缀,删除代码中tools::file_path_sans_ext()调用,直接用basename(all_files_fullpath)做匹配即可
  • 如果需要忽略文件名大小写匹配(比如CSV存的是ma-001,实际文件是MA-001.PDF),将匹配行替换为match_flag <- toupper(all_files_name) %in% toupper(target_name_list)即可
  • 如果需要覆盖目标目录内的同名文件,将file.copy()中的overwrite参数改为TRUE

内容的提问来源于stack exchange,提问作者Connie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:18:23