如何用R编写循环从多个CSV文件提取指定行列并保留文件名汇总导出
解决方案
完全可以实现,仅需单个批量处理逻辑即可完成需求,同时支持保留原文件名作为数据来源标记。
实现逻辑
- 第一步:遍历目标文件夹,获取所有CSV文件的完整路径
- 第二步:逐个读取CSV文件,筛选指定的3个列、提取目标2行数据
- 第三步:新增
source_file字段存储当前文件的名称,标记数据来源 - 第四步:将所有文件的提取结果按行合并,统一导出为汇总CSV
可直接复用的脚本
Tidyverse 版本(代码更简洁,处理效率更高)
需提前安装tidyverse包:运行install.packages("tidyverse")即可
# 加载依赖包 library(tidyverse) # --------------------------需修改的参数-------------------------- # CSV文件所在文件夹的完整路径,Windows系统请将路径斜杠改为/或者双反斜杠 csv_dir <- "替换为你的CSV文件夹路径" # 需要提取的3个列名,需和原文件列名完全一致 target_cols <- c("列名1", "列名2", "列名3") # 需要提取的行号,如提取前2行则写c(1,2) target_rows <- c(2, 5) # ---------------------------------------------------------------- # 获取所有CSV文件路径 csv_paths <- list.files(csv_dir, pattern = "\\.csv$", full.names = TRUE) # 批量处理所有文件并自动合并 final_result <- map_dfr(csv_paths, function(path) { # 读取文件时仅读取指定列,提升处理速度 df <- read_csv(path, col_select = all_of(target_cols), show_col_types = FALSE) # 提取指定行 df_extract <- df[target_rows, ] # 新增来源列,存储原文件名 df_extract$source_file <- basename(path) return(df_extract) }) # 导出汇总结果 write_csv(final_result, "汇总结果.csv")
基础R版本(无需安装额外依赖包)
# --------------------------需修改的参数-------------------------- csv_dir <- "替换为你的CSV文件夹路径" target_cols <- c("列名1", "列名2", "列名3") target_rows <- c(2, 5) # ---------------------------------------------------------------- csv_paths <- list.files(csv_dir, pattern = "\\.csv$", full.names = TRUE) result_list <- list() # 循环处理每个文件 for (i in seq_along(csv_paths)) { df <- read.csv(csv_paths[i], stringsAsFactors = FALSE) # 筛选指定列和行 df_extract <- df[target_rows, target_cols] # 新增来源列 df_extract$source_file <- basename(csv_paths[i]) result_list[[i]] <- df_extract } # 合并所有结果 final_result <- do.call(rbind, result_list) # 导出汇总结果,取消行号输出 write.csv(final_result, "汇总结果.csv", row.names = FALSE)
注意事项
- 列名需和原CSV文件内的列名完全一致,包括大小写、空格、特殊符号,匹配错误会导致运行中断
- 如果需要提取满足筛选条件的2行(非固定行号),将
df[target_rows, ]替换为对应条件筛选逻辑即可 - 若部分文件存在缺少指定列的情况,可在读取逻辑中增加判断分支,跳过异常文件或补入空值,避免整体运行失败
- 文件夹路径尽量避免使用中文、特殊符号,防止部分系统环境下读取文件失败
内容的提问来源于stack exchange,提问作者EJD
相关产品推荐
相关产品推荐

