Как связать дату, извлеченную из файла PDF, с данными, извлеченными из него с помощью R? - PullRequest
1 голос
/ 19 мая 2019

Что у меня есть

У меня есть два файла .pdf, в которых есть таблица с информацией о покупке и продаже и датой в верхнем правом углу заголовка каждой страницы. Смотрите файлы здесь . При необходимости сохраните два файла .pdf и приведенный ниже сценарий в одной папке на вашем компьютере и запустите сценарий, чтобы воспроизвести проблему.

Что мне нужно

Я хочу извлечь только содержимое таблицы из каждого файла, объединить и преобразовать его в таблицу и вставить один первый столбец (в таблицу) с датами, извлеченными из заголовочных файлов.

Таким образом, если первые 5 строк в таблице содержатся в первом файле PDF, то первые 5 строк в первом столбце должны быть заполнены той же самой датой, извлеченной из заголовка первого файла. Если следующие 2 строки после предыдущих 5 строк идут из второго файла, то эти 2 строки в первом столбце должны быть заполнены той же датой, извлеченной из заголовка второго файла.

Что я уже пробовал

Я уже извлек таблицу из каждого файла, присоединяюсь и создаю тиббл, как вы можете видеть ниже. Даже создать код для извлечения даты. Но на самом деле я не знаю, как связать дату, извлеченную из заголовка, с содержимым таблицы каждого файла и вставить ее в таблицу.

Код - извлечение информации из таблицы

## EXTRACT PDF FILE INFORMATION AND GENERATE A CLEAN DATASET

# load library
library(pdftools)
library(tidyverse)


# create a list with all file names
file_names <- dir(pattern = 'N.*')


# extract text from each file and append into a list
text_raw <- list()
for (i in 1:length(file_names)) {
        doc <- pdf_text(file_names[i])
        text_raw <- append(text_raw, doc)
}


# clean data
text_clean <- text_raw %>% 
        str_split('\r\n') %>%
        unlist() %>% 
        as.vector() %>% 
        str_to_lower() %>% 
        str_squish() %>% 
        str_subset('1-bovespa') %>% 
        str_replace('1-', '') %>% 
        str_remove_all('#2?|on|nm|sa') %>% 
        str_squish()


# convert as tibble
df <- tbl_df(text_clean)

# split column
df <- separate(df, 
                value, 
                c('c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8'),
                sep = ' ')
print(df)

Код - Даты выписки

# filter dates
dates <- text_raw %>% 
        str_split('\r\n') %>% 
        unlist() %>% 
        as.vector() %>% 
        str_squish() %>% 
        str_subset('\\d{4}\\s\\d{1}\\s\\d{2}\\/\\d{2}\\/\\d{4}$') %>% 
        str_remove_all('(\\d+\\s\\d{1}\\s)')

print(dates)

Фактический вывод

   c1       c2    c3    c4    c5    c6    c7        c8   
  <chr>    <chr> <chr> <chr> <chr> <chr> <chr>     <chr>
1 bovespa  c     vista cielo 800   10,79 8.632,00  d    
2 bovespa  c     vista cielo 200   10,79 2.158,00  d    
3 bovespa  c     vista brf   400   23,81 9.524,00  d    
4 bovespa  c     vista brf   100   23,81 2.381,00  d   

Ожидаемый результат

   c1           c2       c3    c4    c5    c6    c7     c8        c9
  <chr>        <chr>    <chr> <chr> <chr> <chr> <chr>  <chr>     <chr>
1 10/01/2019   bovespa  c     vista cielo 800   10,79  8.632,00  d    
2 10/01/2019   bovespa  c     vista cielo 200   10,79  2.158,00  d    
3 18/01/2019   bovespa  c     vista brf   400   23,81  9.524,00  d    
4 18/01/2019   bovespa  c     vista brf   100   23,81  2.381,00  d   

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Я думал, что усилия по извлечению дат были излишне сложными, не говоря уже о том, что они, похоже, работали для некоторых из нас, но не помогли мне выполнить код. Вместо этого я построил шаблон даты и извлек его с помощью stringi::stri_extract:

 stringi::stri_extract( regex="[0-3][0-9]/[01][0-9]/20[0-1][0-9]", text_clean)
[1] "18/01/2019"  # this pattern designed for this century dates in the DD/MM/YYYY format

 dates <- stringi::stri_extract( regex="[0-3][0-9]/[01][0-9]/20[0-1][0-9]", text_clean)

 df$C9 <- dates

Кроме того, поскольку в каждом файле PDF было несколько совпадений для шаблона даты, было бы безопаснее выполнить извлечение перед добавлением текста вместе, и тогда вы могли бы использовать только первые значения.

0 голосов
/ 19 мая 2019
df$c0=dates
print(df)

привет, я китаец.

enter image description here

вам просто нужно переименовать имя:

colnames(df)=c("c2","c3","c4","c5","c6","c7","c8","c9")
df$c1=dates
print(df)

...