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

如何从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)

代码说明:

  1. 按文档分组:通过group_by(doc_index)确保每个docx文件的内容独立处理,避免跨文档的区段混淆
  2. 标记关键位置:
    • heading_positions:记录当前文档中所有style_name为"heading 1"的行索引
    • target_starts:从这些Heading 1中筛选出文本包含"Title 1"的行,作为目标区段的起始点
  3. 提取目标区段:
    • 对每个目标起始点,找到下一个Heading 1的位置;如果是文档最后一个Heading 1,则提取到文档末尾
    • 用map处理一个文档中存在多个匹配"Title 1"的Heading 1场景
  4. 清理临时列:移除辅助计算的列,得到干净的目标数据

可选调整:

  • 如果需要忽略大小写匹配(比如匹配"title 1"、"TITLE 1"),将grepl("Title 1", ...)改为grepl("Title 1", ..., ignore.case = TRUE)
  • 如果只需要提取第一个匹配的区段,把target_starts[[1]]改为target_starts[[1]][1]即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:19:54