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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:33:24