在R中使用pdftools在字符串后提取特定表

问题描述

我有几个PDF,我希望提取股东表。如何指定仅提取出现在字符串“ TWENTY LARGEST SHAREHOLDERS”之后的表格?

我尝试过但不太确定功能部分。

library("pdftools")
library("tidyverse")

url <- c("https://www.computershare.com/News/Annual%20Report%202019.pdf?2")

raw_text <- map(url,pdf_text)


clean_table <- function(table){
  table <- str_split(table,"\n",simplify = TRUE)
  table_start <- stringr::str_which(table,"TWENTY LARGEST SHAREHOLDERS")
  table <- table[1,(table_start +1 ):(table_end - 1)]
  table <- str_replace_all(table,"\\s{2,}","|")
  text_con <- textConnection(table)
  data_table <- read.csv(text_con,sep = "|")
  colnames(data_table) <- c("Name","Number of Shares","Percentage")
}

shares <- map_df(raw_text,clean_table) 

解决方法

尝试一下。除了一些小问题以外,主要的变化是我首先获得了包含所需表的页面。顺便说一句:您必须搜索“二十大股东”,而不是“二十大股东”。

library(pdftools)
library(tidyverse)

# download pdf
url <- c("https://www.computershare.com/News/Annual%20Report%202019.pdf?2")

raw_text <- map(url,pdf_text)

clean_table1 <- function(raw) {
  
  # Split the single pages
  raw <- map(raw,~ str_split(.x,"\\n") %>% unlist())
  # Concatenate the splitted pages
  raw <- reduce(raw,c)
  
  table_start <- stringr::str_which(tolower(raw),"twenty largest shareholders")
  table_end <- stringr::str_which(tolower(raw),"total")
  table_end <- table_end[min(which(table_end > table_start))]
  
  table <- raw[(table_start + 3 ):(table_end - 1)]
  table <- str_replace_all(table,"\\s{2,}","|")
  text_con <- textConnection(table)
  data_table <- read.csv(text_con,sep = "|")
  colnames(data_table) <- c("Name","Number of Shares","Percentage")
  data_table
}

shares <- map_df(raw_text,clean_table1) 
head(shares)
#>                                                    Name Number of Shares
#> 1             J P Morgan Nominees Australia Pty Limited      109,500,852
#> 2                         Citicorp Nominees Pty Limited       57,714,777
#> 3                                       Mr Chris Morris       32,231,000
#> 4                             National Nominees Limited       19,355,892
#> 5                                         Welas Pty Ltd       18,950,000
#> 6 BNP Paribas Nominees Pty Ltd <Agency Lending DRP A/C>       11,520,882
#>   Percentage
#> 1      20.17
#> 2      10.63
#> 3       5.94
#> 4       3.56
#> 5       3.49
#> 6       2.12

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...