使用 R 从 PDF 中提取字符串
Extracting strings from a PDF with R
我有来自欧洲议会的 PDF 文件,你可以 download here。
我已经下载了它并把它放在 R 中。
它包含经过 session 投票后的欧洲议会 (MEP) 成员名单。
我只想提取这些列表的一部分。具体来说,我想提取并放入 table 位于 "AVGIVNA RÖSTER"
和 0
、see the text highlighted in this screenshot.
之间的名称
PDF 中重复了一系列类似的名称。它指的是特定的投票。我希望它们都在 table 中。 MEP 的名称改变了,但结构保持不变,它们始终位于位 "AVGIVNA RÖSTER"
和“0”之间。
我想过使用 startswith
函数和 for 循环”,但我在写作方面遇到了困难。
这是我目前所做的:
library(pdftools)
library(tidyverse)
votetext <- pdftools::pdf_text("MEP.pdf") %>%
readr::read_lines()
你可以试试这样的
votetext <- pdftools::pdf_text("MEP.pdf") %>%
readr::read_lines()
a <- which(grepl("AVGIVNA RÖSTER", votetext)) #beginning of string
b <- which(grepl("^\s*0\s*$", votetext)) #end of string
sapply(a, function(x){paste(votetext[x:(min(b[b > x]))], collapse = ". ")})
请注意,在 b
的定义中,我使用 \s*
来查找字符串中的白色 space。
一般来说,您可以先删除尾部和前导白色 space,请参阅 this question。
在你的情况下你可以这样做:
votetext2 <- pdftools::pdf_text("data.pdf") %>%
readr::read_lines() %>%
str_remove("^\s*") %>% #remove white space in the begining
str_remove("\s*$") %>% #remove white space in the end
str_replace_all("\s+", " ") #replace multiple white-spaces with a singe white-space
a2 <- which(votetext2 == "AVGIVNA RÖSTER")
b2 <- which(votetext2 == "0")
result <- sapply(a2, function(x){paste(votetext2[x:(min(b2[b2 > x]))], collapse = ". ")})
result
然后看起来像这样:
`"AVGIVNA RÖSTER. Martin Hojsík, Naomi Long, Margarida Marques, Pedro Marques, Manu Pineda, Ramona Strugariu, Marie Toussaint,. + Dragoş Tudorache, Marie-Pierre Vedrenne. -. Agnès Evren. 0"
我有来自欧洲议会的 PDF 文件,你可以 download here。 我已经下载了它并把它放在 R 中。 它包含经过 session 投票后的欧洲议会 (MEP) 成员名单。
我只想提取这些列表的一部分。具体来说,我想提取并放入 table 位于 "AVGIVNA RÖSTER"
和 0
、see the text highlighted in this screenshot.
PDF 中重复了一系列类似的名称。它指的是特定的投票。我希望它们都在 table 中。 MEP 的名称改变了,但结构保持不变,它们始终位于位 "AVGIVNA RÖSTER"
和“0”之间。
我想过使用 startswith
函数和 for 循环”,但我在写作方面遇到了困难。
这是我目前所做的:
library(pdftools)
library(tidyverse)
votetext <- pdftools::pdf_text("MEP.pdf") %>%
readr::read_lines()
你可以试试这样的
votetext <- pdftools::pdf_text("MEP.pdf") %>%
readr::read_lines()
a <- which(grepl("AVGIVNA RÖSTER", votetext)) #beginning of string
b <- which(grepl("^\s*0\s*$", votetext)) #end of string
sapply(a, function(x){paste(votetext[x:(min(b[b > x]))], collapse = ". ")})
请注意,在 b
的定义中,我使用 \s*
来查找字符串中的白色 space。
一般来说,您可以先删除尾部和前导白色 space,请参阅 this question。
在你的情况下你可以这样做:
votetext2 <- pdftools::pdf_text("data.pdf") %>%
readr::read_lines() %>%
str_remove("^\s*") %>% #remove white space in the begining
str_remove("\s*$") %>% #remove white space in the end
str_replace_all("\s+", " ") #replace multiple white-spaces with a singe white-space
a2 <- which(votetext2 == "AVGIVNA RÖSTER")
b2 <- which(votetext2 == "0")
result <- sapply(a2, function(x){paste(votetext2[x:(min(b2[b2 > x]))], collapse = ". ")})
result
然后看起来像这样:
`"AVGIVNA RÖSTER. Martin Hojsík, Naomi Long, Margarida Marques, Pedro Marques, Manu Pineda, Ramona Strugariu, Marie Toussaint,. + Dragoş Tudorache, Marie-Pierre Vedrenne. -. Agnès Evren. 0"