使用purrr迭代文件目录列表 查找存在目标文件的最新子文件夹路径
代码修改实现方案
实现思路
核心逻辑是把所有年月目录按时间从新到旧排序,遍历校验每个目录下是否存在目标Excel文件,返回第一个符合要求的目录即可读取文件,用purrr的detect()函数可以非常便捷的实现该遍历逻辑,无需手写循环。
依赖包说明
需要提前加载以下包:
library(fs) library(stringr) library(purrr) library(readxl)
完整修改后代码
# 工作簿根路径 workbook_dir <- "Z:/Ac/Iron/STAR" # 目标文件的相对路径(固定部分) target_file_suffix <- file.path("Working", "Group Workbook Log.xlsx") # 1. 提取所有年份目录,按年份倒序排列(最新的年份在前) year_dirs <- dir_ls(workbook_dir, type = "directory") year_nums <- str_extract(year_dirs, "\\d{4}(?=/?)") %>% as.numeric() sorted_year_dirs <- year_dirs[order(-year_nums)] # 2. 对每个年份下的月份目录按月份倒序排列,拼接为全局倒序的年月目录列表 sorted_month_dirs <- map(sorted_year_dirs, function(yd) { month_dirs <- dir_ls(yd, type = "directory") month_nums <- str_extract(month_dirs, "\\d{2}(?=/?)") %>% as.numeric() month_dirs[order(-month_nums)] }) %>% flatten_chr() # 3. 定义校验函数:判断某月份目录下是否存在目标文件 has_target_file <- function(md) { file_exists(file.path(md, target_file_suffix)) } # 4. 遍历查找第一个存在目标文件的月份目录 valid_month_dir <- detect(sorted_month_dirs, has_target_file) # 5. 校验结果并读取文件 if (is.null(valid_month_dir)) { stop("所有年月目录下均未找到目标Excel文件,请检查根路径配置") } else { file <- read_excel(file.path(valid_month_dir, target_file_suffix)) }
关键逻辑说明
- 排序阶段统一按降序排列,确保遍历顺序永远是先查最新的年月,找到第一个符合要求的就终止,性能最优
detect()函数默认返回第一个满足条件的元素,完全匹配需求,不需要额外处理遍历终止逻辑- 增加了全局无匹配文件的报错提示,比原生的文件不存在报错更易定位问题
- 路径操作全部用
fs包的函数,自动适配不同操作系统的路径分隔符,兼容性更好
内容的提问来源于stack exchange,提问作者Jazzmatazz
相关产品推荐
相关产品推荐

