R语言批量提取多PDF固定位置表格的报错排查求助
批量提取多PDF固定位置表格的问题排查与解决方案
问题1:lapply加载文件的报错原因与修复
报错1:找不到文件(No such file or directory)
- 原因:
list.files()默认仅返回文件名,而非完整路径。若当前工作目录不是目标文件夹,pdf_text无法定位文件。 - 修复:调用
list.files时添加full.names = TRUE参数,直接生成完整文件路径。
报错2:无效参数(invalid 'description' argument)
- 原因:
lapply的写法错误,直接传入了pdf_text(files1)的执行结果,而非让lapply遍历每个路径并执行函数。 - 修复:给
lapply传入文件路径列表,以及一个接收单个路径的处理函数。
问题2:循环加载后提取行返回NA的原因
- 原因:
for循环每次都会将document_text覆盖为单个PDF的内容,最终document_text仅保留最后一个PDF的文本。后续用lapply处理单个字符串,自然会返回NA。 - 修复:用
lapply自动收集所有PDF的处理结果,或在循环中主动将结果存入列表。
修正后的完整批量处理代码
# 1. 获取目标文件夹下所有PDF的完整路径 files <- list.files( path = "data/enrolment/Germany/2023", pattern = "pdf", full.names = TRUE # 关键:直接返回完整路径,无需手动拼接 ) # 2. 封装单份PDF的处理逻辑为函数 process_single_pdf <- function(pdf_path) { # 读取PDF文本并按行拆分 PDF <- pdf_text(pdf_path) %>% readr::read_lines() # 提取固定位置的目标行 PDF.grass <- PDF[c(21:36)] # 清理文本并拆分数据 all_stat_lines <- PDF.grass[1:17] %>% str_squish() %>% # 清除多余空格 strsplit(split = " ") # 按空格拆分字段 # 移除多余生成的行 all_stat_lines <- all_stat_lines[-17] # 设置数据框列名 var_lines <- c( "State", "#_Allg_29KW", "#_Allg_28kw", "#_Ber_29KW", "#_Ber_28kw", "#_Ins_29KW", "#_Ins_28kw", "Cont_Allg_29KW", "Cont_Allg_28kw", "Cont_Ber_29KW", "Cont_Ber_28kw", "Cont_Ins_29KW", "Cont_Ins_28kw", "Date" ) # 转换为数据框并赋值列名 df <- plyr::ldply(all_stat_lines) colnames(df) <- var_lines # 新增列标记来源PDF文件,方便后续区分 df$Source_PDF <- basename(pdf_path) return(df) } # 3. 批量处理所有PDF,合并为一个完整数据框 all_pdf_results <- lapply(files, process_single_pdf) %>% dplyr::bind_rows()
内容的提问来源于stack exchange,提问作者ArturR2
相关产品推荐
相关产品推荐

