web-dev-qa-db-ja.com

Rを使用してPDFテーブルを認識

いくつかのPDFレポート内のテーブルからデータを抽出しようとしています。

Pdftoolsと同様のパッケージのいずれかを使用したいくつかの例を見てきましたが、テキストの取得に成功しましたが、表を抽出したいだけです。

Rを使用してテーブルのみを認識および抽出する方法はありますか?

19
RCS

素晴らしい質問、私は最近、同じことについて疑問に思いました、ありがとう!

@ -hrbrmstrも示唆しているように、tabulizer _‘0.2.2’_でそれを行いました。 Rバージョン3.5.2を使用している場合、次のソリューションを提供しています。 3つのパッケージを特定の順序でインストールします。

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

Update:アプローチをもう一度テストした後、今すぐinstall.packages(tabulizer)を実行するだけで十分であるように見えます。 rJavaは依存関係として自動的にインストールされます。

これで、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à
_

それがあなたのために働くことを願っています。

制限:確かにこの例の表は非常に単純であり、gsubstringrtidyrおよびこの種のものをいじる必要があるかもしれません。

15
jay.sf

これに対する答えも知りたいです。しかし、私の経験から、正規表現を使用して、希望する形式でデータを取得する必要があります。例として次を見ることができます:

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

ここから、データをループして、必要に応じてテーブルを作成できます。しかし、リンクからわかるように、PDFはonlyテーブルではありません。