使用R语言按条件删除TXT行并转CSV时遇问题求助
我来帮你搞定这个问题~你遇到的核心问题是代码里盲目删除了</PRE><H3>标记后的30行,刚好把带日期的数据行也囊括进去了,而且还有一段代码没写完导致执行失败。下面我帮你分析问题并给出修正方案:
问题根源拆解
你这段代码的问题主要出在两处:
- 盲目删除固定行数:
你直接删除了包含l2 <- l[-sapply(grep("</PRE><H3>", l), function(x) seq(x, x + 30))]</PRE><H3>的行之后的30行,但带日期的有效数据行刚好落在这个范围内,所以被误删了。 - 代码语法不完整:
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
相关产品推荐
相关产品推荐

