You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:17:23