如何拆分分类TXT文本行并将其转换为R中的table/tibble对象
实现方案
你不需要嵌套while循环,只要额外加一个变量记录当前遍历到的最新物种名称即可,完整代码如下:
library(stringr) library(tibble) library(dplyr) # 仅用于最后过滤行,不需要可以删掉 # 读取原始数据 raw_lines <- readLines("data.txt") # 去除行尾空格和空行,避免格式干扰(可选) raw_lines <- str_trim(raw_lines, side = "right") raw_lines <- raw_lines[raw_lines != ""] # 初始化容器和当前物种缓存变量 species_col <- vector(length = length(raw_lines)) entry_col <- vector(length = length(raw_lines)) current_species <- "" for (i in seq_along(raw_lines)) { # 判断是否为顶层物种行:前3个字符不是空格 if (str_sub(raw_lines[i], 1, 3) != " ") { current_species <- raw_lines[i] species_col[i] <- current_species entry_col[i] <- NA } else { # 从属条目直接使用缓存的当前物种,内容去除前导空格 species_col[i] <- current_species entry_col[i] <- str_trim(raw_lines[i], side = "left") } } # 生成最终结构化表格 result_df <- tibble( 物种名称 = species_col, 从属条目 = entry_col ) %>% filter(!is.na(从属条目)) # 过滤掉顶层物种行,只保留从属记录行
如果你不需要加载dplyr,过滤行可以替换为base R语法:
result_df <- result_df[!is.na(result_df$从属条目), ]
逻辑说明
- 用
current_species变量缓存最近一次识别到的顶层物种名,遍历过程中仅当遇到新的顶层行时更新该变量 - 所有从属行直接匹配当前缓存的物种名,自动完成多对一的关联
- 额外的空行、空格清理逻辑适配Word导出TXT常见的格式冗余问题,可根据你的实际文本格式调整判断条件(比如如果顶层行是数字+点开头,也可以用正则
str_detect(raw_lines[i], "^\\d+\\.")判断,准确度更高)
内容的提问来源于stack exchange,提问作者Tuck
相关产品推荐
相关产品推荐

