如何解决在循环中使用pdftools时的错误处理
我正在尝试从多个pdf文件中提取某些表格,但并非所有文件都具有该表格。 即使第一个文件不包含特定表,如何使用trycatch或类似方法跳过并继续下一个文件?
library(pdftools)
library(tidyverse)
url <- c("https://www.computershare.com/News/Annual%20Report%202019.pdf?2","https://www.annualreports.com/HostedData/AnnualReportArchive/a/LSE_ASOS_2018.PDF")
raw_text <- map(url,pdf_text)
clean_table1 <- function(raw) {
raw <- map(raw,~ str_split(.x,"\\n") %>% unlist())
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_start + 25)]
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)
尝试运行时出现以下错误。
Error in (table_start + 3):(table_start + 25) : argument of length 0
In addition: Warning message:
In min(which(table_end > table_start)) :
no non-missing arguments to min; returning Inf
解决方法
您可以检查length
和table_start
return
中的NULL
是否为0,因此在使用map_df
时,这些记录将自动折叠并且您将一个组合的数据框。
library(tidyverse)
clean_table1 <- function(raw) {
raw <- map(raw,~ str_split(.x,"\\n") %>% unlist())
raw <- reduce(raw,c)
table_start <- stringr::str_which(tolower(raw),"twenty largest shareholders")
if(!length(table_start)) return(NULL)
table_end <- stringr::str_which(tolower(raw),"total")
table_end <- table_end[min(which(table_end > table_start))]
table <- raw[(table_start + 3 ):(table_start + 25)]
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。