web-dev-qa-db-fra.com

Reconnaître PDF table en utilisant R

J'essaie d'extraire des données de tableaux dans certains rapports PDF.

J'ai vu quelques exemples d'utilisation de pdftools et de packages similaires. J'ai réussi à obtenir le texte, cependant, je veux juste extraire les tableaux.

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

19
RCS

Super question, je me suis posé la même question récemment, merci!

Je l'ai fait, avec tabulizer‘0.2.2’ Comme @hrbrmstr le suggère aussi. Si vous utilisez R version 3.5.2, 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")

Mise à jour: Après avoir à nouveau testé l'approche, il semble qu'il suffit de faire install.packages(tabulizer) maintenant . rJava sera installé automatiquement en tant que dépendance.

Vous êtes maintenant prêt à extraire des tableaux 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à

J'espère que ça marche pour toi.

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

15
jay.sf

J'aimerais aussi connaître la réponse à cela. 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 souhaitez. Vous pouvez voir ce qui suit comme 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,}")

À partir de là, les données peuvent ensuite être bouclées pour créer la table comme vous le souhaitez. Mais comme vous pouvez le voir dans le lien, le PDF n'est pas seulement un tableau.

5