【问题标题】:Extracting/Parsing from a PDF to CSV using R?使用 R 从 PDF 提取/解析为 CSV?
【发布时间】:2019-02-26 19:34:21
【问题描述】:

我正在尝试将格式不佳的 PDF 中的数据提取到 .csv 文件中以进行地理编码。我关心的数据是 2018 年科罗拉多州农贸市场的位置 (https://www.colorado.gov/pacific/sites/default/files/Colorado%20Farmers%27%20Markets.pdf)。我希望拥有的必要字段是 Business_Name、Address、City、State、Zip、Hours、Season、Email 和 Website。问题是数据都在一列中,并且并非所有条目都有 100% 完整的数据。也就是说,一个条目下可能有五个属性(姓名、地址、营业时间、邮编、网站),而另一个条目下可能只有两行属性(姓名、地址)。

我在此处 (http://www.coloradofarmers.org/find-markets/) 找到了一个嵌入的位置地图,其中引用了上面的 PDF 文件。我能够将此地图保存到 MyMaps 并将表格复制/粘贴到 CSV,但缺少条目。

有没有办法将这些数据从 PDF 干净地解析为 CSV?我想我需要做的是创建一个有市场的科罗拉多城镇字典(例如“丹佛”、“佳能城”、“特柳赖德”),然后基本上让 R 浏览该列,将存在的每条新行放在查找之间 -将前一个城市行中的城市全部放在单独的字段列中的一行中。或者作为一个逗号分隔的字段,然后根据字段的外观进行解析。

这是我目前所拥有的:

#Set the working directory
setwd("C:/Users/bwhite/Desktop")

#download the PDF of data
?download.file
download.file("https://www.colorado.gov/pacific/sites/default/files/Colorado%20Farmers%27%20Markets.pdf", destfile = "./ColoradoMarkets2018.pdf", method = "auto", quiet = FALSE, mode = "w", cacheOK=TRUE)

#import the pdf table library from CRAN
install.packages("pdftables")

library(pdftables)

#convert pdf to CSV
?convert_pdf
convert_pdf("Colorado Farmers' Markets.pdf",output_file = "FarmersMarkets.csv", 
            format = "csv", message = TRUE, api_key = "n7qgsnz2nkun")

# read in CSV
Markets18 <-read.csv("./FarmersMarkets.csv")

#create a look-up table list of Colorado cities
install.packages("htmltab")
library(htmltab)

CityList <-htmltab("https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Colorado",1)
names(CityList)

感谢任何帮助。

【问题讨论】:

    标签: r parsing pdf data-extraction


    【解决方案1】:

    您只能尝试提取一致的信息。我不是专家,但我试图为某些部分建立逻辑。第 2-20 页有点没有脏数据。此外,如果您注意到,每组可以在下午分开。 (大部分)。由于其中一些列的数量不同,因此很难构建一个逻辑。即使是提取的数据框也需要一些转换。

    library(pdftools)
    
    text<-pdf_text("Colorado Farmers' Markets.pdf")
    library(plyr)
    
    new<-data.frame()
    
    
    text4<-data.frame(Reduce(rbind, text),row.names =c() ,stringsAsFactors = FALSE)
    for (i in 2:20){
    
    list1<-text4[i,1]
    list1<-strsplit(list1,'p.m.')
    final<-data.frame(Reduce(rbind, list1),row.names =c() ,stringsAsFactors = FALSE)
    for (i in 1:dim(final)[1]){
      c<-final[i,]
      c<-strsplit(c,'\n')
    
      new<-rbind.fill(new,data.frame(t(data.frame(c,row.names =c()))))
    }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2020-01-25
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多