【问题标题】:Recognize PDF table using R使用 R 识别 PDF 表格
【发布时间】:2017-10-23 18:45:24
【问题描述】:

我正在尝试从一些 pdf 报告中的表格中提取数据。

我已经看到一些使用 pdftools 和类似软件包的示例,我成功获取了文本,但是,我只想提取表格。

有没有办法使用 R 来识别和提取表?

【问题讨论】:

标签: r text-mining pdf-scraping


【解决方案1】:

好问题,我最近也在想同样的事情,谢谢!

我做到了,@hrbrmstr 也建议使用 tabulizer ‘0.2.2’。如果您使用的是 R > 3.5.x,我将提供以下解决方案。按特定顺序安装三个包:

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

更新: 再次测试该方法后,现在看来只需执行install.packages("tabulizer") 就足够了。 rJava 将作为依赖项自动安装。

现在您可以从 PDF 报告中提取表格了。

library(tabulizer)

## load report
l <- "https://sedl.org/afterschool/toolkits/science/pdf/ast_sci_data_tables_sample.pdf" 
m <- extract_tables(l, encoding="UTF-8")[[2]]  ## comes as a character matrix
## Note: peep into `?extract_tables` for further specs (page, location etc.)!

## use first row as column names
dat <- setnames(type.convert(as.data.frame(m[-1, ]), as.is=TRUE), m[1, ])
## example-specific date conversion
dat$Date <- as.POSIXlt(dat$Date, format="%m/%d/%y")
dat <- within(dat, Date$year <- ifelse(Date$year > 120, Date$year - 100, Date$year))

dat ## voilà
#    Speed (mph)          Driver                        Car    Engine       Date
# 1      407.447 Craig Breedlove          Spirit of America    GE J47 1963-08-05
# 2      413.199       Tom Green           Wingfoot Express    WE J46 1964-10-02
# 3      434.220      Art Arfons              Green Monster    GE J79 1964-10-05
# 4      468.719 Craig Breedlove          Spirit of America    GE J79 1964-10-13
# 5      526.277 Craig Breedlove          Spirit of America    GE J79 1965-10-15
# 6      536.712      Art Arfons              Green Monster    GE J79 1965-10-27
# 7      555.127 Craig Breedlove Spirit of America, Sonic 1    GE J79 1965-11-02
# 8      576.553      Art Arfons              Green Monster    GE J79 1965-11-07
# 9      600.601 Craig Breedlove Spirit of America, Sonic 1    GE J79 1965-11-15
# 10     622.407   Gary Gabelich                 Blue Flame    Rocket 1970-10-23
# 11     633.468   Richard Noble                   Thrust 2 RR RG 146 1983-10-04
# 12     763.035      Andy Green                 Thrust SSC   RR Spey 1997-10-15

希望它对你有用。

限制:当然,这个例子中的表格很简单,你可能不得不乱用gsub之类的东西。

【讨论】:

  • tabulizer 安装起来非常困难。我从来没有让它在我的 Mac 上运行。
  • .@jaySf - 我面临的问题是tabulizer() 正在读取所有表格,但只读取表格的标题而不是表格的内容。任何建议如何解决这个问题?
  • @ChetanArvindPatil 很难说没有任何例子。我认为这取决于创建 pdf 的软件是否可以正常工作。
  • 我发现这很有帮助,但仍然没有完全工作......stackoverflow.com/questions/43884603/… 提供了对我有用的替代步骤。 (Win10)
【解决方案2】:

我也很想知道这个问题的答案。但是根据我的经验,您需要使用正则表达式以您想要的格式获取数据。您可以看到以下示例:

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 只是一张表格。

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多