我将大量的pdf转换为单个大规模的csv。
典型的pdf如下所示:
当我使用pdftools将页面转换为单个文本字符串时,我得到了这个:
当我在页面的字符串上使用cat()
函数时,我得到了这个:
我的问题是:cat()
函数如何知道每列开始的位置?如何通过pdf字符串干净地解析?我正在使用R代码来放置&#39 ;;'每当字符串中有两个以上的空格时,我就会遇到一堆问题。
第一个问题是' sexo'变量只在它和'c.identidad'之间有一个空格。变量。我的解决方案是使用str_replace()
在前面添加空格和' sexo'变量(' VAR'和' MUJ')。
我发现的第二个问题是,有些观察结果只有一个选区与选区之间只有一个空格。和'外交和#39;变量。我发现了'外围人员'与' comuna'基本相同。在标题中。因此,我的解决方案是str_locate()
来确定' comuna'是,然后使用str_replace()
在字符串匹配' comuna'的所有实例的正面和背面添加空格。
第三个问题是有时候选举的选举权问题。观察的变量也包括'comuna'。这意味着我将用于将字符串切换为pdf的代码(任何长度大于2的空格都转换为&#39 ;;')将为包含'的任何观察提供额外的变量。 comuna'字符串不止一次。
一旦出现第三个问题,我开始认为必须有一种更简单的方法来解析这个pdf文档。如果cat()
可以通过pdf字符串干净地解析,那么必须有类似的东西来帮助我以有序的方式解析它。任何帮助,指导,链接或想法将不胜感激。
我使用的pdf是公开的,可在以下网址找到:http://web.servel.cl/padronAuditado.html
以下是我的代码的最终版本。它有大约6%的明显错误率。我通过计算具有“台面”的观察结果来测量误差。变量为空白。
require(stringr)
require(dplyr)
require(pdftools)
pdf_to_csv2 <- function(doc){
text <- pdf_text(doc)
COMUNA_LOCATE = str_locate(text[1], "COMUNA:.+PAGINA")
COMUNA = text[1] %>% str_sub(COMUNA_LOCATE[1], COMUNA_LOCATE[2]) %>%
str_replace('COMUNA:', '') %>%
str_replace('PAGINA', '') %>%
str_trim('both')
cleaned_text <- text %>% str_replace_all(' VAR ', ' VAR ') %>%
str_replace_all(' MUJ ', ' MUJ ') %>%
str_replace_all(paste(COMUNA, ' '), paste(' ', COMUNA, ' ')) %>%
str_replace('IDENTIDAD SEXO', 'IDENTIDAD SEXO') %>%
str_replace_all('\r\n', 'END_LINE') %>%
str_replace_all('\\s\\s+', ';') %>%
str_replace_all('END_LINE', '\n')
for(i in c(1:length(cleaned_text))) {write(cleaned_text[i], paste0(doc, '_', i))}
}