从每个文档中提取变量并放置在适当的列中的循环
Loop for extracting variable from each document and placing in appropriate column
我公司在 pdf 格式的文件中为每个客户记录了 policies/services 的摘要。这些文件每年都会组合成一个大数据集。每个客户一行,列是客户文档中的变量。这些文件有几千个,每个文件都有大约 20-30 个变量。我想通过创建一个 data.frame 来自动化这个过程,每一行代表一个客户,然后从他们的 pdf 文档中提取每个客户的变量。我能够通过目录中的 pdf 文件名创建所有客户端的列表或 data.frame,但不知道如何创建一个循环来提取每个文档所需的每个变量。我目前有两种不同的方法,我无法在两者之间做出决定,并且还需要一个循环来获取每个客户端文档所需的变量的帮助。下面提供了我的代码和两个模拟文件的链接。如有任何帮助,我们将不胜感激!
方法一:pdftools
第一种方法的好处是它将整个 pdf 提取到一个矢量中,并将每个页面提取到一个单独的元素中。这样方便我拉strings/variables。但是,不知道如何循环它以从每个客户端提取信息并将其适当地放置在每个客户端的列中。
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"))
这是我认为可以使用您提出的方法 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
}
我从文本中删除了逗号,假设您提取的任何数字变量都希望在某些分析中用作数字。不过,这会删除 all 逗号,因此如果这些逗号在其他领域很重要,您将不得不重新考虑。
另请注意,我将样本 PDF 放入了名为 'pdfs' 的目录中。
我想通过一点创意正则表达式,您可以提取任何其他有用的东西。如果感兴趣的元素始终位于所有文档的同一页面上,则使用此方法可以轻松抓取数据。 (注意 str_match
行中 f
的索引。)希望这对您有所帮助!
我公司在 pdf 格式的文件中为每个客户记录了 policies/services 的摘要。这些文件每年都会组合成一个大数据集。每个客户一行,列是客户文档中的变量。这些文件有几千个,每个文件都有大约 20-30 个变量。我想通过创建一个 data.frame 来自动化这个过程,每一行代表一个客户,然后从他们的 pdf 文档中提取每个客户的变量。我能够通过目录中的 pdf 文件名创建所有客户端的列表或 data.frame,但不知道如何创建一个循环来提取每个文档所需的每个变量。我目前有两种不同的方法,我无法在两者之间做出决定,并且还需要一个循环来获取每个客户端文档所需的变量的帮助。下面提供了我的代码和两个模拟文件的链接。如有任何帮助,我们将不胜感激!
方法一:pdftools
第一种方法的好处是它将整个 pdf 提取到一个矢量中,并将每个页面提取到一个单独的元素中。这样方便我拉strings/variables。但是,不知道如何循环它以从每个客户端提取信息并将其适当地放置在每个客户端的列中。
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"))
这是我认为可以使用您提出的方法 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
}
我从文本中删除了逗号,假设您提取的任何数字变量都希望在某些分析中用作数字。不过,这会删除 all 逗号,因此如果这些逗号在其他领域很重要,您将不得不重新考虑。
另请注意,我将样本 PDF 放入了名为 'pdfs' 的目录中。
我想通过一点创意正则表达式,您可以提取任何其他有用的东西。如果感兴趣的元素始终位于所有文档的同一页面上,则使用此方法可以轻松抓取数据。 (注意 str_match
行中 f
的索引。)希望这对您有所帮助!