如何通过循环读取两个不同日期文件夹下的所有CSV文件并标识新旧
双日期文件夹同名CSV读取重命名解决方案
现有代码核心问题梳理
- 循环内部拼接路径时误用了整个
Date向量而非迭代变量i,导致路径生成错误 list.files函数的pattern参数错误放到了path参数的拼接字符串内,属于语法错误- 每次循环都会覆盖
files变量,最终只能保留最后一个日期的文件列表 - 没有关联两个日期对应的
old/new标签,无法实现要求的命名规则
完整实现代码
首先加载依赖包:
# 未安装的话先运行 install.packages("stringr") library(stringr)
主运行代码:
# 定义日期顺序,第一个对应old版本,第二个对应new版本 date_vec <- c("17JUL2021", "18AUG2021") label_vec <- c("_old", "_new") # 替换为你自己的文件基础存储路径 base_path <- "~datapath/" # 遍历两个日期文件夹 for (date_idx in seq_along(date_vec)) { current_date <- date_vec[date_idx] current_label <- label_vec[date_idx] # 拼接当前日期对应的csv文件夹路径 csv_path <- paste0(base_path, current_date, "/csv/") # 获取当前路径下所有csv文件的完整路径,兼容.CSV大写后缀 csv_files <- list.files(path = csv_path, pattern = "\\.csv$", full.names = TRUE, ignore.case = TRUE) # 逐个读取文件并重命名 for (file_path in csv_files) { # 提取不带后缀的原始文件名 raw_filename <- str_remove(basename(file_path), "\\.csv$") # 拼接生成要求的变量名 new_var_name <- paste0(raw_filename, current_label) # 读入文件并赋值给对应变量 assign(new_var_name, read.csv(file_path, stringsAsFactors = FALSE)) } }
代码说明
- 提前绑定日期和标签的对应关系,可自行调整日期顺序修改old/new对应规则
- 自动适配大小写csv后缀,不需要额外处理文件名格式
- 读入的同时完成变量命名,完全符合
FILEA_old、FILEA_new的命名要求 - 不需要单独写重命名步骤,避免路径拼接错误
可选优化建议
如果后续需要批量处理所有文件,建议将数据存入命名列表,比分散的独立变量更方便批量操作:
all_data <- list() for (date_idx in seq_along(date_vec)) { current_date <- date_vec[date_idx] current_label <- label_vec[date_idx] csv_path <- paste0(base_path, current_date, "/csv/") csv_files <- list.files(path = csv_path, pattern = "\\.csv$", full.names = TRUE, ignore.case = TRUE) for (file_path in csv_files) { raw_filename <- str_remove(basename(file_path), "\\.csv$") new_var_name <- paste0(raw_filename, current_label) all_data[[new_var_name]] <- read.csv(file_path, stringsAsFactors = FALSE) } } # 调用方式为 all_data$FILEA_old 或者 all_data[["FILEA_old"]]
内容的提问来源于stack exchange,提问作者Bonnie
相关产品推荐
相关产品推荐

