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
相关产品推荐
相关产品推荐

