首页 文章

从PDF的特定位置提取数据?

提问于
浏览
4

我正在尝试从pdf中提取数据,这可以位于https://www.dol.gov/ui/data.pdf . 我感兴趣的数据在PDF的第4页,是初始索赔(NSA)的3个观察结果,保险失业(NSA)的3个观察结果,以及最近一周使用的覆盖就业(脚注2) .

我已经使用pdftools将PDF读入R,但生成的文本输出非常难看(由于PDF的性质,有点可以预期) . 有什么办法可以从这个文本输出中提取特定数据吗?我相信数据将始终在输出中的相同位置,这是有帮助的 .

我正在查看的输出可以通过以下脚本看到:

library(pdftools)

download.file("https://www.dol.gov/ui/data.pdf", "data.pdf", mode="wb")

uidata <- pdf_text("data.pdf")
uidata[4]

我搜索过类似问题的人并用scan()和grep()进行了调整,但似乎无法找到一种方法来从文本输出中分离和提取我需要的数据 . 如果有人偶然发现并且可以指出我正确的方向,请提前感谢 - 如果不是,我会试图解决这个问题!

1 回答

  • 6

    使用 grep 和一点regex,您可以将所需的一切都变为可用的结构:

    library(magrittr)
    
    x <- pdftools::pdf_text('https://www.dol.gov/ui/data.pdf')
    x2 <- readLines(textConnection(x[4]))
    r <- grep('WEEK ENDING', x2)
    
    l <- lapply(seq_along(r), function(i){
        x2[r[i]:(na.omit(c(r[i + 1], grep('FOOTNOTE', x2)))[1] - 1)] %>% 
            trimws() %>% 
            gsub('\\s{2,}', ';', .) %>% 
            paste(collapse = '\n') %>% 
            read.csv2(text = ., dec = '.')
        })
    
    from_footnote <- as.numeric(gsub('^2|\\D', '', x2[grep('2\\.', x2)]))
    
    l[[1]][3,]
    #>                      WEEK.ENDING December.17 December.10  Change
    #> Initial Claims (NSA)     315,613     305,333     +10,280 352,534
    #>                      December.3
    #> Initial Claims (NSA)    319,641
    
    from_footnote
    #> [1] 138322138
    

    你仍然需要解析数字,但至少它是可用的 .

相关问题