Цикл для извлечения переменной из каждого документа и размещения в соответствующем столбце

Моя компания документирует резюме политик/услуг для каждого клиента в файле в формате pdf. Эти файлы ежегодно объединяются в большой набор данных. Одна строка на клиента и столбцы являются переменными в документе клиента. Этих файлов пара тысяч и в каждом примерно по 20-30 переменных. Я хочу автоматизировать этот процесс, создав data.frame с каждой строкой, представляющей клиента, а затем извлекая переменные для каждого клиента из их pdf-документа. Я могу создать список или data.frame всех клиентов по имени файла pdf в каталоге, но не знаю, как создать цикл, который извлекает каждую переменную, которая мне нужна для каждого документа. В настоящее время у меня есть два разных метода, между которыми я не могу выбрать, а также мне нужна помощь с циклом, который захватывает переменные, которые мне нужны для каждого клиентского документа. Мой код и ссылки на два фиктивных файла приведены ниже. Любая помощь будет оценена по достоинству!

Файлы: Клиент 1 и Клиент 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"))

person Michael    schedule 17.09.2017    source источник


Ответы (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».

Я бы предположил, что с небольшим творческим регулярным выражением вы можете извлечь что-нибудь еще, что было бы полезно. Использование этого метода упрощает сбор данных, если интересующие элементы всегда будут находиться на одних и тех же страницах во всех документах. (Обратите внимание на индекс f в строках str_match.) Надеюсь, это поможет!

person Brendan A.    schedule 17.09.2017
comment
Это отлично работает - спасибо! Когда я добавляю больше переменных в цикл, я просто добавляю строку для извлечения переменных, а затем вторую строку для добавления их в data.frame, или мне также нужно настроить размер data.frame (например, количество колонки) как-нибудь? Если это представляет интерес, конечной целью будет извлечение этой базы данных в файл Excel, поскольку это поле (я новичок в этом) широко использует Excel для аналитики. - person Michael; 18.09.2017
comment
Вы захотите изменить все три вещи, которые вы упомянули: столбцы в пустом data.frame, строку для извлечения интересующей переменной и еще одну, чтобы добавить ее в ваш data.frame. Если ваша следующая переменная называется Risk_modeling, вам понадобится client_df <- data.frame(client = rep(NA, lf), fr = rep(NA, lf), risk_modeling = rep(NA, lf)). Затем что-то вроде risk_modeling <- str_match(...) и client_df$risk_modeling[i] <- risk_modeling. - person Brendan A.; 18.09.2017
comment
Вы были чрезвычайно полезны. Спасибо, что нашли время объяснить. - person Michael; 18.09.2017