2017-05-23 2 views
5

J'essaie d'extraire des données à partir de tableaux à l'intérieur de certains rapports PDF.Reconnaître le tableau PDF en utilisant R

J'ai vu quelques exemples en utilisant soit pdftools et des paquets similaires J'ai réussi à obtenir le texte, cependant, je veux juste extraire les tables.

Existe-t-il un moyen d'utiliser R pour reconnaître et extraire uniquement les tables?

+1

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

+0

tabulizer (ropensci github) – hrbrmstr

Répondre

3

J'aimerais aussi connaître la réponse à cette question. Mais d'après mon expérience, vous devez utiliser des expressions régulières pour obtenir les données dans un format que vous voulez. Vous pouvez voir ce qui suit comme un exemple:

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,}") 

De là, les données peuvent alors être mises en boucle pour créer la table comme vous le souhaitez. Mais comme vous pouvez le voir dans le lien, le PDF n'est pas seulement une table.

3

Awsome question, je me suis posé la question à peu près la même chose récemment, merci!

Je l'ai fait, avec tabulizer comme suggère @hrbrmstr aussi. Si vous utilisez déjà R version 3.4.0, je fournis la solution suivante. Installez les trois packages dans un ordre spécifique:

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

Vous êtes maintenant prêt à extraire des tables de vos rapports 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à 

Espérons que cela fonctionne pour vous.

Limitations: Certes, le tableau dans cet exemple est assez simple et peut-être vous de bricoler avec gsub, stringrtidyr et ce genre de choses.