如何提取文件名片段添加至多个TXT后合并并保存为CSV?
批量处理TXT并合并为CSV的实现方案
需求说明
- 处理一批变量数量、名称完全一致的TXT文件
- 为每个文件新增3列数据,提取自文件名的特定片段:
- Month:文件名中2022后的前两位(如示例里的
05) - Day:日期部分的日(如示例里的
05) - Hour:起始时间的小时(如示例里的
14)
- Month:文件名中2022后的前两位(如示例里的
- 最终将所有处理后的文件合并成一个CSV,新增列需对应每个源TXT的唯一文件名
文件名格式示例:
NVR_ch2_main_20220505140000_20220505150000
你已实现的单文件处理代码:
read_tsv('NVR_ch2_main_20220505132105_20220505140000.txt') %>% mutate(filename = 'NVR_ch2_main_20220505132105_20220505140000.txt') %>% select(filename, everything()) %>% write_csv('C:/Users/marta/Documents/R/Crete/NVR_ch2_main_20220505132105_20220505140000.csv')
批量处理步骤
1. 加载依赖包
需要用到tidyverse(包含readr和dplyr)和fs包来批量操作文件:
library(tidyverse) library(fs)
2. 获取所有目标TXT文件路径
把下面的路径替换成你的文件实际存放路径:
txt_files <- dir_ls("你的TXT文件所在文件夹路径", regexp = "\\.txt$")
3. 编写批量处理函数
这个函数会自动读取文件、从文件名提取所需字段并新增列:
process_file <- function(file_path) { # 读取单个TXT文件 df <- read_tsv(file_path) # 获取纯文件名(去掉路径) file_name <- path_file(file_path) # 提取文件名里的起始时间片段(2022开头的10位字符:2022MMDDHH) time_part <- str_extract(file_name, "2022\\d{6}") # 拆分出Month、Day、Hour month_val <- str_sub(time_part, 5, 6) # 第5-6位是月份 day_val <- str_sub(time_part, 7, 8) # 第7-8位是日期 hour_val <- str_sub(time_part, 9, 10) # 第9-10位是小时 # 新增列并调整列顺序 df %>% mutate( filename = file_name, Month = month_val, Day = day_val, Hour = hour_val ) %>% select(filename, Month, Day, Hour, everything()) }
4. 批量处理并合并所有文件
用map_dfr自动遍历所有文件,处理后合并成一个数据框:
combined_data <- map_dfr(txt_files, process_file)
5. 保存合并后的CSV
替换成你想要保存的路径:
write_csv(combined_data, "C:/Users/marta/Documents/R/Crete/combined_all_data.csv")
内容的提问来源于stack exchange,提问作者Marta Bolgan
相关产品推荐
相关产品推荐

