如何用R批量读取无分隔符无表头TXT文件并合并为数据框?
解决批量读取固定宽度TXT文件并合并的问题
咱们先定位你代码里的核心问题:你定义的myfile是单个文件的路径字符串,而lapply(myfile, ...)会把这个字符串拆成单个字符逐个遍历,这就导致fn被赋值成/、P这类单个字符,自然会报错找不到文件。
接下来给你完整的分步解决方案:
步骤1:获取所有目标TXT文件的路径列表
先把文件夹里160个TXT文件的路径一次性提取出来,用list.files函数就能轻松搞定:
# 设置文件所在的文件夹路径 file_dir <- "//PATH/AllFiles/" # 获取所有.txt后缀的文件完整路径,避免混入其他类型文件 file_list <- list.files(path = file_dir, pattern = "\\.txt$", full.names = TRUE)
这里pattern = "\\.txt$"是正则表达式,确保只匹配后缀为.txt的文件;full.names = TRUE会返回包含完整路径的文件名,方便后续直接读取。
步骤2:批量读取并合并文件
现在用lapply遍历刚才生成的文件列表,同时修正你的read.fwf参数(我核对过,你给出的列宽和列名数量完全匹配,没问题):
# 提前定义固定宽度和列名,方便后续维护 col_widths <- c(5,20,8,2,20,8,2,40,29,2,5,4,8,1,6,1,9,1,9) col_names <- c("NUM","YNUM","STREETNUM","STREETPRED","STREETNAME","STREETTYPE","STREETPOSTD","STREETADD2","CITY", "STATE","ZIP","ZIP4","EFFDATE","TYPE", "PREMIUM","FILL", "VAMOUNT","FILLS","OVAMOUNT") # 批量读取并合并,同时添加文件名列方便后续溯源 CompleteDataCollection <- do.call(rbind, lapply(file_list, function(fn) { # 读取单个固定宽度文件 df <- read.fwf(fn, widths = col_widths, header = FALSE, col.names = col_names) # 添加文件名列(用basename只保留文件名,去掉路径) df$Filename <- basename(fn) return(df) }))
效率优化建议
如果文件数量多、体积大,do.call(rbind, ...)的合并效率会偏低,推荐用以下两种更快的方式:
方式1:用tidyverse的purrr::map_dfr
library(purrr) CompleteDataCollection <- map_dfr(file_list, function(fn) { df <- read.fwf(fn, widths = col_widths, header = FALSE, col.names = col_names) df$Filename <- basename(fn) df })
方式2:用data.table的rbindlist
library(data.table) CompleteDataCollection <- rbindlist(lapply(file_list, function(fn) { df <- read.fwf(fn, widths = col_widths, header = FALSE, col.names = col_names) df$Filename <- basename(fn) as.data.table(df) }))
额外注意事项
- 确保所有160个文件的固定宽度完全一致,如果有个别文件格式异常,会导致读取失败,建议先抽查几个文件验证格式。
- 如果文件体积很大,推荐用
readr::read_fwf(tidyverse工具),它支持进度条,读取速度比基础包的read.fwf更快:
library(readr) CompleteDataCollection <- map_dfr(file_list, function(fn) { df <- read_fwf(fn, fwf_widths(col_widths, col_names)) df$Filename <- basename(fn) df })
内容的提问来源于stack exchange,提问作者Brian Gal
相关产品推荐
相关产品推荐

