如何在R中读取.txt文件*/标记后的数据?现有代码无输出求解决
问题分析与解决方案
问题原因
- 正则表达式不匹配:你写的
^\\s*/{1}是匹配「行开头的任意空白+单个斜杠」,但目标标记是*/,需要匹配星号加斜杠,正则应该调整为^\\s*\\*/(星号是正则特殊字符,必须转义)。 - 逻辑错误:原代码只把匹配到标记的那一行加入
lines,但你需要的是标记之后的所有数据行,不是标记行本身。
修正后的单个文件处理代码
# 打开文件连接 con <- file("D:/Test/Data1.txt", "r") lines <- c() collect <- FALSE # 控制是否开始收集数据的开关 while(TRUE) { line <- readLines(con, 1) # 文件读取完毕则退出循环 if(length(line) == 0) break # 匹配到*/标记(允许前面有空白字符) if(grepl("^\\s*\\*/", line)) { collect <- TRUE # 开启收集开关 next # 跳过标记行,不加入结果 } # 如果开关开启,收集当前行 if(collect) { lines <- c(lines, line) } } close(con) # 务必关闭文件连接 # 将收集到的行转为数据框(假设第一行是表头) data_df <- read.table(text = lines, header = TRUE)
多文件批量处理方案
如果要处理不同文件夹下的所有.txt文件,可以用以下代码批量处理并合并结果:
# 加载purrr包简化循环(也可以用base R的lapply) library(purrr) # 获取所有txt文件的完整路径(recursive=TRUE会遍历子文件夹) file_list <- list.files(path = "D:/Test", pattern = "\\.txt$", full.names = TRUE, recursive = TRUE) # 定义单个文件的处理函数 process_single_file <- function(file_path) { con <- file(file_path, "r") lines <- c() collect <- FALSE while(TRUE) { line <- readLines(con, 1) if(length(line) == 0) break if(grepl("^\\s*\\*/", line)) { collect <- TRUE next } if(collect) { lines <- c(lines, line) } } close(con) # 转为数据框并添加文件名标识 df <- read.table(text = lines, header = TRUE) df$source_file <- basename(file_path) return(df) } # 批量处理所有文件并合并为一个大数据框 all_data <- map_dfr(file_list, process_single_file)
关键说明
- 正则
^\\s*\\*/:确保能匹配到行开头(可能带空白)的*/标记,不会漏判或误判。 collect开关:精准控制只收集标记之后的内容,避免混入前面的说明信息。- 关闭文件连接:每次处理完文件后用
close(con)释放资源,防止出现文件占用问题。
内容的提问来源于stack exchange,提问作者Alexia k Boston
相关产品推荐
相关产品推荐

