如何从PDF/RTF格式兽医报告中提取指定字段数据导入电子表格
从RTF格式兽医报告中提取结构化数据的实现方案
你之前使用的代码不生效有两个核心原因:一是read.delim仅用于读取固定分隔符的结构化纯文本,无法识别RTF的格式标记;二是grep直接传入文件名不会匹配文件内容,只会匹配文件名本身的字符。
步骤1:将RTF转换为无格式纯文本
首先用专门的工具去掉RTF的格式标签,R环境下可以用striprtf包实现:
# 首次使用先安装依赖包 install.packages("striprtf") library(striprtf) library(stringr) # 读取RTF文件并转为纯文本 raw_content <- read_rtf("你的文件路径.rtf") full_text <- paste(raw_content, collapse = "\n")
步骤2:按单份报告拆分文本
因为所有报告格式统一,找到每份报告的固定开头标识(比如常规是Animal:开头)拆分内容:
# 按报告开头标识拆分,过滤空内容 report_start_flag <- "Animal: " report_list <- strsplit(full_text, report_start_flag)[[1]] report_list <- report_list[nchar(report_list) > 0] # 补回被拆分掉的开头标识 report_list <- paste0(report_start_flag, report_list)
步骤3:批量提取指定字段内容
按照你需要的字段写匹配规则,提取对应内容存入结构化表格:
# 定义所有需要提取的字段 base_fields <- c("Animal", "Age", "Type", "Gender", "lab ref", "sample date", "received date") test_fields <- c("Total Protein", "Albumin") # 可自行补充所有需要的检测项 all_fields <- c(base_fields, test_fields) # 初始化结果表 result_df <- data.frame(matrix(nrow = length(report_list), ncol = length(all_fields))) colnames(result_df) <- all_fields # 循环提取每份报告的对应字段 for (idx in seq_along(report_list)) { single_report <- report_list[idx] for (field in all_fields) { # 匹配规则:字段名+任意空格+直到换行的内容 pattern <- paste0(field, "\\s+([^\\n\\r]+)") match_res <- str_match(single_report, pattern) if (!is.na(match_res[1,2])) { result_df[idx, field] <- trimws(match_res[1,2]) } } }
步骤4:导出为电子表格兼容格式
直接导出为CSV即可用Excel、WPS等工具打开编辑:
write.csv(result_df, "提取完成的兽医报告数据.csv", row.names = FALSE, na = "")
可选调整项
- 如果字段名大小写不统一,可以把匹配规则改为
regex(pattern, ignore_case = TRUE)忽略大小写 - 如果检测项数值带单位,可以额外加逻辑提取纯数字:
str_extract(匹配到的内容, "[0-9\\.]+") - 如果报告有分页符,可以先执行
full_text <- gsub("\\f", "", full_text)清除分页符再拆分
内容的提问来源于stack exchange,提问作者Mirelle Radley
相关产品推荐
相关产品推荐

