Извлечение таблиц из PDF в R - PullRequest
       11

Извлечение таблиц из PDF в R

0 голосов
/ 05 сентября 2018

Мне нужно извлечь таблицы из PDF. Вот ссылка

https://ainfo.cnptia.embrapa.br/digital/bitstream/item/155505/1/doc-202-1.pdf

Я хочу извлечь таблицы со страницы 15 - страница 21. Все эти таблицы имеют одинаковую структуру (18 столбцов) и заголовки. Вот снимок одной таблицы. enter image description here

В каждой таблице меня интересуют только столбцы 6–8 и 17 столбца: Ciclo, Graus Dias/dias, Epcaja de Plantion and Regiao de adaptacao`

Вот что я сделал:

library(dplyr)
library(tabulizer)

out <- extract_tables("mydocument.pdf"), pages = c(15:21))

# this gives me a list of 7 tables. 

temp <- data.frame(out[[1]]) # taking the first table as an example
temp %>% dplyr::select(X3, X4, X5, X12) # these are the columns corresponding to `Ciclo`, `Graus Dias/dias`, Epcaja de Plantion` and `Regiao de adaptacao`

# this is a snapshot of first table

enter image description here

Однако когда я извлекаю 7-ю таблицу:

  temp <- data.frame(out[[7]])

#  Column 1: 4 are merged into a single column. 

enter image description here

Таким образом, функция extract_tables не выполняет согласованное положение столбцов и объединяет столбцы в некоторых таблицах. Как я могу это исправить так, что у меня
объединенная таблица с колонками Ciclo , Graus Dias / dias , Epcaja de Plantion и Regiao de adaptacao в одном файле CSV.

1 Ответ

0 голосов
/ 05 сентября 2018

Это проблема подготовки и обработки данных, а не проблема анализа в моем опыте, так как алгоритмы синтаксического анализа tabulizer не предлагают много возможностей, кроме переключения между методами, в данном случае. Из того, что я вижу, когда я пытаюсь извлечь ваши таблицы, это не только таблица страницы № 7, которая неправильно анализируется. Каждая страница анализируется по-разному, но все данные, похоже, сохраняются. Я вижу, что ваша первая таблица имеет 13 столбцов, вторая 17, 3 12, 4 10 и последние три 11 столбцов. Вместо этого я бы предложил проанализировать каждую страницу по отдельности и выполнить очистку данных в соответствии с желаемым результатом каждого из них, а затем связать их вместе. Это длительный процесс, очень специфичный для каждой анализируемой таблицы, поэтому я приведу только пример сценария:

library(dplyr)
library(tidyr)
library(tabulizer)
# I create a dummy list to iterate through all the pages and push a data.frame in
result <- list()
for (i in 15:21){
  out <- as.data.frame(extract_tables("mydocument.pdf", page = i, method = 'stream'), stringsAsFactors = FALSE)
  result[[i]] <- out
}
# Remove excess list items -
# there is probably a better way to do this from within the for loop
result <- result[-(1:14)]

## ------- DATA CLEANING OPERATIONS examples:
# Remove top 3x lines from the first page of table1 not part of data
result[[1]] <- result[[1]][-(1:3),]
# Perform data cleaning operations such as split/ merge columns according to your liking
# for instance if you want to split column X1 into 4 (as in your original post), you can do that by splitting by whitespace
result[[1]] <- separate(result[[1]], 1, into = c('X1.1','X1.2','X1.3', 'X1.4'),sep = ' ', remove = TRUE)

## ---- After data cleaning operations:
# Bind all dataframes (they should have equal number of columns by now into one and make sure the colnames match as well)
df <-bind_rows(result)
# Write your output csv file
write.csv(df, 'yourfilename.csv')

Также вы могли бы взглянуть на различные методы синтаксического анализа tabulizer (я установил здесь значение 'stream', так как по моему опыту обычно дает лучшие результаты, но, возможно, 'решетка' будет работать лучше для некоторых из таблицы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...