循环用于从每个文档中提取变量并放入适当的列

时间:2017-09-17 19:31:58

标签: r loops pdf dataframe stringr

我的公司在pdf格式的文件中记录每个客户的政策/服务摘要。这些文件每年合并为一个大型数据集。每个客户端一行,列是客户端文档中的变量。这些文件有数千个,每个文件大约有20-30个变量。我想通过创建一个data.frame来自动化这个过程,每个行代表一个客户端,然后从他们的pdf文档中提取每个客户端的变量。我能够通过目录中的pdf文件名创建所有客户端的列表或data.frame,但不知道如何创建一个循环来拉取每个文档所需的每个变量。我目前有两种不同的方法,我无法决定,还需要一个循环来帮助我获取每个客户文档所需的变量。我的代码和两个模拟文件的链接如下所示。任何帮助将不胜感激!

文件:Client 1Client 2

方法1:pdftools

第一种方法的好处是它将整个pdf提取到一个向量中,并将每个页面提取到一个单独的元素中。这使我更容易拉出字符串/变量。但是,不知道如何循环它以从每个客户端提取信息并将其适当地放在每个客户端的列中。

library(pdftools)
library(stringr)

Files <- list.files(path="...", pattern=".pdf")
Files <- Files %% mutate(FR =
  str_match(text, "\\$\\d+\\s\\Financial Reporting")) #Extract the first variable

方法2:

这种方法的好处是它自动为每个客户文档创建一个数据库,文件名为一行,每个pdf在一个变量中。缺点是变量中的整个pdf使得匹配和提取字符串比将每个页面放在其自己的元素中更加困难。我不知道如何编写一个循环来为每个客户端提取变量并将它们放在各自的列中。

DF <- readtext("directory pathway/*.pdf")
DF <- DF %>% mutate(FR =
                    str_match(text, "\\$\\d+\\s\\Financial Reporting"))

1 个答案:

答案 0 :(得分:2)

这是一个基本框架,我认为使用您提出的方法1解决您的问题。

library(pdftools)
library(stringr)

Files <- list.files(path="pdfs/", pattern=".pdf")
lf <- length(Files)

client_df <- data.frame(client = rep(NA, lf), fr = rep(NA, lf))
for(i in 1:lf){
  # extract the text from the pdf
  f <- pdf_text(paste0("pdfs/", Files[i]))

  # remove commas from numbers
  f <- gsub(',', '', f)

  # extract variables
  client_name <- str_match(f[1], "Client\\s+\\d+")[[1]]
  fr <- as.numeric(str_match(f[1], "\\$(\\d+)\\s+Financial Reporting")[[2]])

  # add variables to your dataframe
  client_df$client[i] <- client_name
  client_df$fr[i] <- fr
}

我假设你提取的任何数字变量都想在某些分析中用作数字,我从文本中删除了逗号。这会删除所有逗号,所以如果这些在其他方面很重要,则必须重新考虑。

另请注意,我将示例PDF放入名为“pdfs”的目录中。

我认为通过一点创意正则表达式,你可以提取任何有用的东西。如果感兴趣的元素将始终位于所有文档的相同页面上,则使用此方法可以轻松抓取数据。 (请注意f行中str_match上的索引。)希望这会有所帮助!