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

使用R语言按条件删除TXT行并转CSV时遇问题求助

我来帮你搞定这个问题~你遇到的核心问题是代码里盲目删除了</PRE><H3>标记后的30行,刚好把带日期的数据行也囊括进去了,而且还有一段代码没写完导致执行失败。下面我帮你分析问题并给出修正方案:

问题根源拆解

你这段代码的问题主要出在两处:

  1. 盲目删除固定行数:
    l2 <- l[-sapply(grep("</PRE><H3>", l), function(x) seq(x, x + 30))]
    
    你直接删除了包含</PRE><H3>的行之后的30行,但带日期的有效数据行刚好落在这个范围内,所以被误删了。
  2. 代码语法不完整:
    l3 <- l2[-sapply(grep("<P>Description",...)] 这段代码没写完,缺少闭合括号和逻辑,会直接导致执行报错。
修正后的解决方案

我提供两种适配不同场景的代码,你可以根据自己的TXT文件结构选择:

场景1:只删除含特定标记的行,不碰其他内容

如果</PRE><H3>和<P>Description本身是无关行,你只需要删除这些行本身,不需要连带删后续行:

setwd("D:/tugasmaritim/")
# 精准匹配后缀为.txt的文件,避免误匹配其他类似后缀的文件
FILES <- list.files(pattern = "\\.txt$")

for (i in 1:length(FILES)) {
  # 读取文件,跳过前4行无关内容
  l <- readLines(FILES[i], skip = 4)
  
  # 删除包含"</PRE><H3>"的行
  l2 <- l[-grep("</PRE><H3>", l)]
  
  # 删除包含"<P>Description"的行(补全你未完成的逻辑)
  l3 <- l2[-grep("<P>Description", l2)]
  
  # 将处理后的文本转为数据框(请根据你的实际分隔符调整sep参数,比如制表符"\t"、逗号",")
  df <- read.table(text = l3, header = FALSE, sep = "\t")
  
  # 保存为同名CSV文件
  write.csv(df, sub("\\.txt$", ".csv", FILES[i]), row.names = FALSE)
}

场景2:删除标记后的无关内容,保留日期行及之后的数据

如果</PRE><H3>之后是一大段无关内容,直到出现日期行才是有效数据,我们可以精准定位日期行的起始位置,只保留有效内容:

setwd("D:/tugasmaritim/")
FILES <- list.files(pattern = "\\.txt$")

for (i in 1:length(FILES)) {
  l <- readLines(FILES[i], skip = 4)
  
  # 找到含"</PRE><H3>"的行索引
  bad_line_pos <- grep("</PRE><H3>", l)
  if (length(bad_line_pos) > 0) {
    # 匹配日期行(这里假设日期格式是YYYY-MM-DD,你可以根据实际修改正则)
    date_line_pos <- grep("^[0-9]{4}-[0-9]{2}-[0-9]{2}", l)
    if (length(date_line_pos) > 0) {
      # 只保留第一个日期行及之后的内容
      l2 <- l[min(date_line_pos):length(l)]
    } else {
      # 如果没找到日期行,就只删除含"</PRE><H3>"的行
      l2 <- l[-bad_line_pos]
    }
  } else {
    l2 <- l
  }
  
  # 删除含"<P>Description"的行
  l3 <- l2[-grep("<P>Description", l2)]
  
  # 转数据框并保存
  df <- read.table(text = l3, header = FALSE, sep = "\t")
  write.csv(df, sub("\\.txt$", ".csv", FILES[i]), row.names = FALSE)
}
小提示
  • 先拿单个文件测试代码,确认没问题再批量处理,避免误操作
  • 如果你的日期格式不是YYYY-MM-DD,记得修改grep里的正则表达式,匹配你实际的日期格式
  • 一定要根据TXT文件的实际分隔符调整read.table的sep参数,不然转成数据框会出错

内容的提问来源于stack exchange,提问作者ExHunter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:03:15