R语言遍历子文件夹txt文件批量处理生成单汇总文件方法
问题根因
你当前代码的核心问题有两个:
- 调用
dir()时未设置full.names = TRUE参数,返回的只有txt文件名本身,没有拼接文件所在的子文件夹完整路径,R无法定位到具体文件,自然没法开展后续读取操作 - 现有代码仅完成了文件名收集,没有嵌套「读取单个txt-执行自定义分析-暂存结果」的逻辑,也没有最终跨文件汇总输出的步骤
完整实现方案
你可以直接套用下面的代码框架,仅需替换自己的txt读取、分析逻辑即可适配需求:
# 1. 配置父文件夹基础路径 parent_folder <- "C:/.../18_0101" # 2. 一次性获取所有子文件夹内txt文件的完整路径 all_txt_path <- list.files( path = parent_folder, pattern = "\\.txt$", # 匹配后缀为txt的文件 full.names = TRUE, # 返回完整文件路径,而非仅文件名 recursive = TRUE # 递归遍历所有子文件夹 ) # 3. 初始化结果存储列表 all_result <- list() # 4. 遍历所有txt文件执行统一分析流程 for (i in seq_along(all_txt_path)) { # 读取当前txt文件,根据自身文件格式调整参数即可 current_data <- read.table( file = all_txt_path[i], header = TRUE, # 文件含表头设为TRUE,无表头改FALSE sep = "\t", # 按实际分隔符修改,逗号分隔填",",空格分隔填" " stringsAsFactors = FALSE, fileEncoding = "UTF-8" # 按文件实际编码调整,中文文件常用"GBK" ) # -------------------------- # 替换为你自己的单文件分析逻辑 # 输出结果建议为数据框格式,方便后续合并 current_analysis_res <- data.frame( file_path = all_txt_path[i], # 自定义计算的指标列追加在这里,例如: # mean_value = mean(current_data$target_column, na.rm = TRUE), # row_count = nrow(current_data) ) # -------------------------- # 将当前文件分析结果存入汇总列表 all_result[[i]] <- current_analysis_res } # 5. 合并所有文件的分析结果为单个汇总表 final_summary <- do.call(rbind, all_result) # 6. 将汇总结果输出到父文件夹下 write.csv( x = final_summary, file = file.path(parent_folder, "all_subfolder_summary.csv"), row.names = FALSE, fileEncoding = "UTF-8" )
可选:按子文件夹维度聚合的版本
如果你需要先完成单个子文件夹内所有txt的聚合分析,再输出子文件夹维度的汇总结果,可以使用以下逻辑:
parent_folder <- "C:/.../18_0101" # 获取所有子文件夹路径 sub_folders <- list.dirs(parent_folder, recursive = TRUE, full.names = TRUE)[-1] folder_result_list <- list() for (j in seq_along(sub_folders)) { # 获取当前子文件夹下所有txt的完整路径 current_folder_txt <- list.files( path = sub_folders[j], pattern = "\\.txt$", full.names = TRUE ) # 读取并合并当前子文件夹内所有txt数据 folder_data <- lapply(current_folder_txt, function(txt_path) { read.table(txt_path, header = TRUE, sep = "\t", stringsAsFactors = FALSE) }) folder_data <- do.call(rbind, folder_data) # 执行子文件夹维度的自定义分析 folder_res <- data.frame( sub_folder_path = sub_folders[j], # 自定义子文件夹维度的计算结果列 ) folder_result_list[[j]] <- folder_res } # 合并所有子文件夹结果并输出 folder_final_summary <- do.call(rbind, folder_result_list) write.csv(folder_final_summary, file.path(parent_folder, "folder_level_summary.csv"), row.names = FALSE)
注意事项
- 读取txt时务必根据实际文件格式调整
read.table参数,常见调整项包括分隔符sep、表头设置header、缺失值标识na.strings、编码格式fileEncoding - 如果单文件体积较大,不要保留全量读取的数据,在遍历环节仅提取需要的字段做计算即可,降低内存占用
- 调试阶段可以在循环开头加一行
print(paste("正在处理:", all_txt_path[i])),打印当前处理的文件路径,快速定位格式异常的问题文件
内容的提问来源于stack exchange,提问作者Heiwa
相关产品推荐
相关产品推荐

