R循环中提取文件日期并解决隐藏文件读取错误问题
问题解决:合并CSV文件+提取日期列+处理隐藏文件错误
一、解决Icon\r隐藏文件读取错误
这个问题是Mac系统下的Finder操作产生的隐藏文件,原代码用all.files=TRUE会把这类系统文件纳入读取列表。直接过滤掉非CSV文件即可:
- 给
list.files添加pattern = "\\.csv$"参数,只匹配以.csv结尾的文件,自动跳过隐藏文件。
二、从文件名提取日期作为新列
针对标准化文件名adh-merged_YYYY-MM-DD.csv,可以用正则表达式直接提取日期部分,两种实现方式任选:
方式1:用tidyverse工具(更简洁高效)
library(tidyverse) ROOT.DIR <- "~/Google Drive/My Drive/PhD/CFHH_Monthly_Extracts/trial" ROOT.DIR.MERGES <- paste0(ROOT.DIR, "/Merges") # 仅读取CSV文件,避免隐藏文件 files <- list.files(ROOT.DIR.MERGES, pattern = "\\.csv$", full.names = TRUE) # 批量读取文件并添加日期列 master_adh_merge <- map_dfr(files, function(file_path) { # 提取文件名中的YYYY-MM-DD格式日期 file_date <- str_extract(basename(file_path), "\\d{4}-\\d{2}-\\d{2}") # 读取文件并新增日期列 read.csv(file_path) %>% mutate(extract_date = file_date) }) # 输出合并后的文件 datestamp <- format(Sys.Date(), "%Y-%m-%d") write.csv( master_adh_merge, paste0(ROOT.DIR, "/master-merge/master-adh-merge_", datestamp, ".csv"), row.names = FALSE )
方式2:基础R实现(无需额外包)
ROOT.DIR <- "~/Google Drive/My Drive/PhD/CFHH_Monthly_Extracts/trial" ROOT.DIR.MERGES <- paste0(ROOT.DIR, "/Merges") # 过滤CSV文件,排除隐藏文件 files <- list.files(ROOT.DIR.MERGES, pattern = "\\.csv$", full.names = TRUE) # 批量读取并合并,同时添加日期列 master_adh_merge <- do.call(rbind, lapply(files, function(file_path) { # 用正则捕获组提取日期 file_date <- sub("adh-merged_(\\d{4}-\\d{2}-\\d{2})\\.csv", "\\1", basename(file_path)) df <- read.csv(file_path) df$extract_date <- file_date df })) # 输出文件 datestamp <- format(Sys.Date(), "%Y-%m-%d") write.csv( master_adh_merge, paste0(ROOT.DIR, "/master-merge/master-adh-merge_", datestamp, ".csv"), row.names = FALSE )
关键优化说明
- 替换循环
rbind为map_dfr或do.call(rbind, lapply(...)),大幅提升大文件合并的效率。 - 正则提取日期的逻辑更稳定,无需纠结
gsub的复杂替换规则,直接匹配YYYY-MM-DD格式即可。
内容的提问来源于stack exchange,提问作者mda08rds
相关产品推荐
相关产品推荐

