2017-05-23 26 views
5

Próbuję wyodrębnić dane z tabel w niektórych raportach pdf.Rozpoznawanie tabeli PDF za pomocą R

Widziałem kilka przykładów przy użyciu albo pdftools i podobnych pakietów Udało mi się uzyskać tekst, ale po prostu chcę wyodrębnić tabele.

Czy istnieje sposób na użycie R do rozpoznawania i wydzielania tylko tabel?

+1

Pakiet 'pdftables': https://cran.r-project.org/web/packages/pdftables/pdftables.pdf –

+0

tabulizer (ropensci github) – hrbrmstr

Odpowiedz

3

Chciałbym znać odpowiedź na to również. Ale z mojego doświadczenia wynika, że ​​musisz używać wyrażeń regularnych, aby uzyskać dane w odpowiednim formacie. Możesz zobaczyć następujące przykłady:

library(pdftools) 
dat <- pdftools::pdf_text("https://s3-eu-central-1.amazonaws.com/de-hrzg-khl/kh-ffe/public/artikel-pdfs/Free_PDF/BF_LISTE_20016.pdf") 
dat <- paste0(dat, collapse = " ") 
pattern <- "Berufsfeuerwehr\\s+Straße(.)*02366.39258" 
extract <- regmatches(dat, regexpr(pattern, dat)) 
extract <- gsub('\n', " ", extract) 
strsplit(extract, "\\s{2,}") 

Stąd dane mogą być zapętlone, aby utworzyć tabelę według potrzeb. Ale jak widać w linku, plik PDF nie jest tabelą.

3

Awsome pytanie, zastanawiałem się nad tym samym ostatnio, dzięki!

Zrobiłem to, z tabulizer jak sugeruje również @hrbrmstr. Jeśli używasz już wersji R 3.4.0, zapewniam następujące rozwiązanie. Zainstaluj trzy pakiety w określonej kolejności:

install.packages("rJava") 
library(rJava) # load and attach 'rJava' now 
install.packages("devtools") 
devtools::install_github("ropensci/tabulizer", args="--no-multiarch") 

Teraz jesteś gotowy, aby wyodrębnić tabele z raportów PDF.

library(tabulizer) 

# specify an example and load it into your workspace 
report <- "http://www.stat.ufl.edu/~athienit/Tables/Ztable.pdf" 
lst <- extract_tables(report, encoding="UTF-8") 
# peep into the doc for further specs (page, location etc.)! 

# after examing the list you want to do some tidying 
# 1st delete blank columns 
lst[[1]] <- lst[[1]][, -3] 
lst[[2]] <- lst[[2]][, -4] 

# 2nd bind the list elements, if you want and create a df... 
table <- do.call(rbind, lst) 
table <- as.data.frame(table[c(2:37, 40:nrow(table)), ], 
         stringsAsFactors=FALSE) # ...w/o obsolete rows 

# 3rd take over colnames, cache rownames to vector 
colnames(table) <- table[1, ] 
rn <- table[2:71, 1] 
table <- table[-1,-1] # and bounce them out of the table 

# 4th I'm sure you want coerce to numeric 
table <- as.data.frame(apply(table[1:70,1:10], 2, 
          function(x) as.numeric(as.character(x)))) 
rownames(table) <- rn # bring back rownames 

table # voilà 

Mam nadzieję, że to działa dla Ciebie.

Ograniczenia: Oczywiście tabela w tym przykładzie jest bardzo prosta i może trzeba poeksperymentować z gsub, stringrtidyr i tego rodzaju rzeczy.