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

如何编写R函数rbind合并多zip包内同结构NAME.CSV文件

Zip包内同名CSV批量合并函数

以下封装的函数复用了原脚本基于data.table的高性能读写、合并逻辑,同时做了参数化、异常校验、临时文件自动清理的优化,可直接复用。

library(data.table)

merge_csv_from_zips <- function(
    zip_dir,
    target_csv = "NAME.CSV",
    keep_unzipped = FALSE,
    add_source_col = TRUE,
    source_col_name = "zip_source",
    case_sensitive = FALSE
) {
  # 前置参数校验
  if (!dir.exists(zip_dir)) stop("指定的Zip存储目录不存在:", zip_dir)
  if (!requireNamespace("data.table", quietly = TRUE)) stop("请先安装data.table包后再运行函数")

  # 提取目录下所有Zip文件路径
  zip_list <- list.files(
    path = zip_dir,
    pattern = "\\.zip$",
    recursive = FALSE,
    full.names = TRUE
  )
  if (length(zip_list) == 0) stop("当前目录下未检测到任何.zip格式压缩文件")

  # 选择解压路径:选择保留解压文件则解压到原目录,否则使用系统临时目录
  exdir <- if (keep_unzipped) zip_dir else tempdir()

  # 批量解压所有Zip包
  lapply(zip_list, function(zip_path) {
    unzip(zipfile = zip_path, exdir = exdir, overwrite = TRUE)
  })

  # 递归查找所有匹配的目标CSV文件
  csv_match_pattern <- paste0("(^|\\\\|/)", target_csv, "$")
  csv_list <- list.files(
    path = exdir,
    pattern = csv_match_pattern,
    recursive = TRUE,
    ignore.case = !case_sensitive,
    full.names = TRUE
  )
  if (length(csv_list) == 0) stop("解压后未找到任何名为", target_csv, "的目标文件")

  # 批量读取CSV并按行合并
  dt_read_list <- lapply(csv_list, fread)
  if (add_source_col) {
    # 来源列默认标记对应Zip包的文件名,可读性更高
    names(dt_read_list) <- gsub("\\.zip$", "", basename(zip_list))
    merged_result <- rbindlist(dt_read_list, idcol = source_col_name)
  } else {
    merged_result <- rbindlist(dt_read_list)
  }

  # 若使用临时目录解压,自动清理所有解压产生的临时文件
  if (!keep_unzipped) {
    unlink(file.path(exdir, list.files(exdir, recursive = TRUE)), recursive = TRUE)
  }

  return(merged_result)
}
使用示例
  • 基础场景:对应原需求,合并C:/ZFILE目录下所有Zip包内的NAME.CSV,直接运行即可,默认自动清理临时解压文件,结果自带Zip来源列
merged_dt <- merge_csv_from_zips(zip_dir = "C:/ZFILE")
  • 自定义场景:按需调整参数即可适配其他需求
# 示例1:合并目标为DATA.CSV,且保留解压后的原始文件
merged_dt2 <- merge_csv_from_zips(
  zip_dir = "C:/ZFILE",
  target_csv = "DATA.CSV",
  keep_unzipped = TRUE
)

# 示例2:不需要来源标记列,文件名匹配严格区分大小写
merged_dt3 <- merge_csv_from_zips(
  zip_dir = "C:/ZFILE",
  add_source_col = FALSE,
  case_sensitive = TRUE
)
优化点说明
  • 所有可变配置均封装为函数入参,更换目录、目标文件名时不需要修改函数内部逻辑,复用性更强
  • 修复了原脚本中目标文件匹配的正则转义错误,避免出现匹配不到目标CSV的问题
  • 默认使用系统临时目录存放解压文件,合并完成后自动清理,不会在原目录产生大量零散冗余文件
  • 增加多层前置校验,遇到目录不存在、无Zip文件、无目标CSV等异常场景时直接抛出明确报错,不会运行到中途才中断
  • 来源列默认标记对应Zip包的文件名,比原脚本记录的完整CSV路径可读性更高,同时支持自定义来源列名

内容的提问来源于stack exchange,提问作者denis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:03:23