如何通过名称匹配自动合并两个目录下的TXT文件并导出?
解决思路与完整代码实现
先给你修正现有代码里的语法问题,比如字符串拼接的括号没闭合、gsub的括号缺失,还有第二个循环里误用了ls[i](应该是ls1[i]),调整后的基础导入代码更规范:
# 定义两个目录的路径(替换成你的实际路径) dir1_path <- "C:/directory1" dir2_path <- "C:/directory2" # 获取两个目录下的txt文件列表(只匹配以.txt结尾的文件) ls <- list.files(dir1_path, pattern = "\\.txt$", full.names = FALSE) ls1 <- list.files(dir2_path, pattern = "\\.txt$", full.names = FALSE) # 导入目录1的文件到列表,用去掉后缀的文件名作为列表元素名 get <- list() for(i in 1:length(ls)){ file_path <- file.path(dir1_path, ls[i]) # 用file.path自动处理路径分隔符,比paste更安全 import <- read.table(file = file_path, sep = "") get[[gsub("\\.txt$", "", ls[i])]] <- import # 修正括号缺失问题 } # 导入目录2的文件到列表,同理处理 get2 <- list() for(i in 1:length(ls1)){ file_path <- file.path(dir2_path, ls1[i]) import <- read.table(file = file_path, sep = "") get2[[gsub("\\.txt$", "", ls1[i])]] <- import # 修正原代码误用ls[i]的问题 }
下一步:自动匹配合并并保存文件
接下来我们要找出两个列表中名称完全一致的文件(也就是去掉后缀后的名字相同的),然后逐个合并,最后保存为新的TXT文件:
# 获取两个列表的共同元素名——这就是我们要匹配的文件对 common_names <- intersect(names(get), names(get2)) # 先判断有没有匹配的文件,避免空循环 if(length(common_names) == 0){ stop("没有找到匹配的文件,请检查两个目录下的文件名是否一致!") } # 创建保存合并后文件的目录(如果不存在的话) output_dir <- "C:/merged_files" if(!dir.exists(output_dir)){ dir.create(output_dir) } # 循环处理每一对匹配的文件 for(name in common_names){ # 合并数据:这里用rbind按行合并,如果你需要按列合并就换成cbind merged_data <- rbind(get[[name]], get2[[name]]) # 设置输出文件的路径和名称 output_file <- file.path(output_dir, paste0(name, "_merged.txt")) # 保存合并后的文件,参数可按需调整 write.table(merged_data, file = output_file, sep = "", row.names = FALSE, col.names = FALSE) # 打印进度提示,方便你查看处理情况 cat("已完成合并并保存:", output_file, "\n") }
几个关键细节说明:
- 合并方式:默认用
rbind(按行合并),适合两个文件是同结构、不同行的数据;如果是同结构不同列的需求,直接把rbind换成cbind即可。 - 保存参数:
row.names = FALSE和col.names = FALSE是避免保存时自动添加行名/列名,如果你需要保留这些信息,可以去掉这两个参数。 - 文件名匹配:用
intersect精准筛选两个目录都存在的文件,避免出现找不到对应文件的报错。
这样整个流程就完整啦,从导入文件、自动匹配,到合并保存都能自动完成~
内容的提问来源于stack exchange,提问作者user2018
相关产品推荐
相关产品推荐

