如何编写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
相关产品推荐
相关产品推荐

