【问题标题】:Loop for extracting variable from each document and placing in appropriate column循环从每个文档中提取变量并放置在适当的列中
【发布时间】:2018-02-26 07:53:56
【问题描述】:

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

文件:Client 1Client 2

方法一: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

方法二:

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

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

【问题讨论】:

    标签: r loops pdf dataframe stringr


    【解决方案1】:

    这是一个我认为可以使用您提出的方法 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”的目录中。

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

    【讨论】:

    • 这很好用——谢谢!当我向循环中添加更多变量时,我是否只需添加一行用于提取变量,然后添加第二行用于将其添加到 data.frame,或者我是否还需要调整 data.frame 大小(例如,列)以某种方式?如果感兴趣,最终目标是将此数据库提取到 Excel 文件中,因为该字段(我是新手)广泛使用 Excel 进行分析。
    • 您需要更改您提到的所有三件事:空 data.frame 中的列、提取感兴趣变量的行,以及将其添加到 data.frame 中的另一行。如果您的下一个变量称为 risk_modeling,那么您将需要 client_df &lt;- data.frame(client = rep(NA, lf), fr = rep(NA, lf), risk_modeling = rep(NA, lf))。然后是risk_modeling &lt;- str_match(...)client_df$risk_modeling[i] &lt;- risk_modeling
    • 您非常有帮助。感谢您花时间解释。
    猜你喜欢
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2011-09-10
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多