使用R提取存在换行问题的PDF中经营活动净现金流量数据
R提取PDF中运营现金流数值的解决方案
方案1:手动拼接文本处理换行问题
先把PDF转成文本后,处理换行导致的文本拆分问题,精准定位目标数值:
library(pdftools) library(stringr) # 读取PDF并处理文本行 pdf_content <- pdf_text("你的PDF文件路径.pdf") text_lines <- unlist(strsplit(pdf_content, "\n")) # 清理空行和多余空格 text_lines <- trimws(text_lines) text_lines <- text_lines[text_lines != ""] target_label <- "Net cash from / (used in) operating activities" extracted_nums <- c() # 遍历每一行找目标标签 for (line_idx in seq_along(text_lines)) { if (grepl(target_label, text_lines[line_idx])) { # 先从当前行提取数值 num <- str_extract(text_lines[line_idx], "\\([0-9,]+\\)|[0-9,]+") if (!is.na(num)) { extracted_nums <- c(extracted_nums, num) } else { # 当前行没找到就取下一行的数值(根据实际情况也可以查上一行) num <- str_extract(text_lines[line_idx + 1], "\\([0-9,]+\\)|[0-9,]+") if (!is.na(num)) { extracted_nums <- c(extracted_nums, num) } } } } # 输出结果 print(extracted_nums)
- 核心逻辑:用
grepl定位目标文本所在行,再用正则匹配带括号的数值格式,同时覆盖数值和文本同行、换行到下一行的情况。
方案2:用专门的表格提取工具绕开文本换行问题
如果pdftools的文本拆分太乱,试试tabulizer直接提取表格(需要提前安装Java环境):
library(tabulizer) target_label <- "Net cash from / (used in) operating activities" extracted_nums <- c() # 提取PDF里的所有表格 all_tables <- extract_tables("你的PDF文件路径.pdf") # 遍历表格找目标行 for (table in all_tables) { # 找目标标签所在的行 target_row <- which(grepl(target_label, table[, 1])) if (length(target_row) > 0) { # 假设数值在表格最后一列,可根据实际调整列索引 num <- table[target_row, ncol(table)] extracted_nums <- c(extracted_nums, num) } } print(extracted_nums)
- 注意:如果表格位置特殊,可以用
extract_tables的area参数指定表格的坐标范围,提升提取准确率。
实用提示
- 正则
\\([0-9,]+\\)|[0-9,]+能精准匹配带括号的负数(比如(3,785))和普通正数(比如1,258) - 运行前可以先打印
text_lines看看文本的实际换行情况,再调整行匹配的逻辑 - 如果PDF有多页,记得循环处理每一页的内容
内容的提问来源于stack exchange,提问作者dsafdsfsdf777sdfh
相关产品推荐
相关产品推荐

