如何从officer读取的多docx合并DataFrame提取指定Heading1区段
提取指定Heading 1区段的内容
基于你已合并的docx数据框df,可以通过按文档分组+标记目标区段的方式,精准提取从匹配"Title 1"的Heading 1开始,到下一个Heading 1之前的所有内容。以下是具体实现代码:
library(dplyr) library(purrr) df_target <- df %>% group_by(doc_index) %>% mutate( # 记录当前文档中所有Heading 1的行索引 heading_positions = list(which(style_name == "heading 1")), # 在Heading 1中筛选出文本包含"Title 1"的起始行索引 target_starts = list( heading_positions[[1]][grepl("Title 1", text[heading_positions[[1]]])] ) ) %>% # 提取每个目标起始点到下一个Heading 1之前的行 slice({ if (length(target_starts[[1]]) == 0) { integer(0) } else { map(target_starts[[1]], function(start) { next_heading <- heading_positions[[1]][heading_positions[[1]] > start][1] if (is.na(next_heading)) start:n() else start:(next_heading - 1) }) %>% unlist() } }) %>% ungroup() %>% # 移除临时辅助列 select(-heading_positions, -target_starts)
代码说明:
- 按文档分组:通过
group_by(doc_index)确保每个docx文件的内容独立处理,避免跨文档的区段混淆 - 标记关键位置:
heading_positions:记录当前文档中所有style_name为"heading 1"的行索引target_starts:从这些Heading 1中筛选出文本包含"Title 1"的行,作为目标区段的起始点
- 提取目标区段:
- 对每个目标起始点,找到下一个Heading 1的位置;如果是文档最后一个Heading 1,则提取到文档末尾
- 用
map处理一个文档中存在多个匹配"Title 1"的Heading 1场景
- 清理临时列:移除辅助计算的列,得到干净的目标数据
可选调整:
- 如果需要忽略大小写匹配(比如匹配"title 1"、"TITLE 1"),将
grepl("Title 1", ...)改为grepl("Title 1", ..., ignore.case = TRUE) - 如果只需要提取第一个匹配的区段,把
target_starts[[1]]改为target_starts[[1]][1]即可
内容的提问来源于stack exchange,提问作者AudileF
相关产品推荐
相关产品推荐

