如何使用R将多个csv文件合并为各csv对应独立工作表的单个xlsx文件
问题原因
你遇到的仅显示第一个csv内容的问题,核心是两个常见代码逻辑缺陷:
- sheet名称提取逻辑错误:你写的
strsplit(strsplit(filenames_list[i], "/")[[1]][4], "\\.")[[1]][1]硬编码取路径拆分后的第4个元素作为工作表名,如果Path目录实际路径层级和你预设的不一致,会导致所有循环拿到的工作表名完全重复,后写入的内容会直接覆盖前一个工作表,最终仅保留单次写入的内容。 - 循环追加写入方式不稳定:不管你使用的是
xlsx还是openxlsx扩展包,循环调用write.xlsx加append=T的写入方式很容易出现IO冲突、隐式覆写问题,本身就不是推荐的实现方案。
最优解决代码
推荐使用不需要Java环境、稳定性更高的openxlsx包实现,先创建空白工作簿、批量写入工作表后一次性保存,完全避免上述问题:
# 首次使用先安装扩展包,已安装可跳过 install.packages("openxlsx") # 加载扩展包 library(openxlsx) path <- "Path" # 仅匹配目录下的csv文件,避免其他格式文件被误读 filenames_list <- list.files(path = path, pattern = "\\.csv$", full.names = TRUE) # 初始化空白工作簿 wb <- createWorkbook() # 循环写入每个工作表 for (i in seq_along(filenames_list)) { # 自动提取csv文件名作为工作表名,无需硬编码路径层级,适配所有系统 sheet_name <- gsub("\\.csv$", "", basename(filenames_list[i])) # 读取csv内容 temp <- read.csv(filenames_list[i]) # 新增工作表并写入数据 addWorksheet(wb, sheetName = sheet_name) writeData(wb, sheet = sheet_name, x = temp, rowNames = FALSE) } # 一次性保存最终文件,overwrite=T可直接覆盖已存在的同名文件 saveWorkbook(wb, file = file.path(path, "output.xlsx"), overwrite = TRUE)
优化点说明
- 用
basename()+正则替换提取文件名,完全规避硬编码路径层级带来的兼容性问题,适配Windows、macOS、Linux全平台路径格式 - 所有数据写入工作簿对象后再一次性保存,彻底消除循环追加写入的覆写、IO冲突问题
- 新增
pattern参数过滤文件,避免目录下存在非csv文件时导致代码报错
内容的提问来源于stack exchange,提问作者Natasha R.
相关产品推荐
相关产品推荐

