批量上传CSV文件添加对应文件名列的技术实现问题
通用多CSV合并并添加文件名标识的解决方案
没问题,我来给你一个完全通用的方案,不管你有多少个CSV文件都能自动处理,不用逐个判断文件名!
用data.table实现(和你现有代码风格一致)
既然你本来就在用data.table的fread,那我们直接基于这个工具来改造,核心思路是在读取每个文件的同时,自动提取文件名(去掉.csv后缀)并添加为col2列,最后再合并所有文件:
library(data.table) # 第一步:获取目标路径下所有CSV文件的完整路径 # 把"your_path_here"替换成你的实际文件路径 csv_files <- list.files(path = "your_path_here", pattern = "\\.csv$", # 只匹配.csv结尾的文件 full.names = TRUE, # 返回完整路径,方便后续读取 ignore.case = TRUE) # 可选:如果要匹配.CSV这种大写后缀的话加上 # 第二步:定义一个读取单个文件并添加文件名列的函数 read_with_id <- function(file_path) { # 提取纯文件名(去掉路径和.csv后缀) file_id <- tools::file_path_sans_ext(basename(file_path)) # 读取CSV并新增col2列 dt <- fread(file_path) dt[, col2 := file_id] return(dt) } # 第三步:批量处理所有文件并合并 combined_data <- rbindlist(lapply(csv_files, read_with_id))
用tidyverse实现(如果你偏好这套工具链)
如果你习惯用dplyr和readr,也可以用下面的方案,逻辑是一样的:
library(tidyverse) # 同样先获取所有CSV文件路径 csv_files <- list.files(path = "your_path_here", pattern = "\\.csv$", full.names = TRUE, ignore.case = TRUE) # 批量读取并合并,同时添加文件名标识 combined_data <- map_dfr(csv_files, function(file_path) { file_id <- tools::file_path_sans_ext(basename(file_path)) read_csv(file_path) %>% mutate(col2 = file_id) })
关键细节说明
tools::file_path_sans_ext(basename(file_path)):这一步是核心,basename去掉文件的路径部分,file_path_sans_ext去掉后缀,比如"/data/A.csv"会变成"A"。- 不管你有1个还是100个CSV文件,这个代码都能自动处理,不需要修改任何部分,只要确保路径正确即可。
- 如果你的文件名里有特殊字符或者空格也不用担心,这个方法完全兼容。
内容的提问来源于stack exchange,提问作者themli
相关产品推荐
相关产品推荐

