【发布时间】:2019-10-06 05:09:50
【问题描述】:
我有什么
我有两个 .pdf 文件,其中有一个表格,其中包含买卖股票信息以及每个页面右上角标题的日期。请参阅文件here。如有必要,将两个 .pdf 文件和下面的脚本保存到计算机的同一文件夹中,然后运行脚本以重现问题。
我需要什么
我只想从每个文件中提取表格内容,加入并将其转换为 tibble,然后插入一个第一列(到 tibble),其中包含从头文件中提取的日期。
因此,如果 tibble 中的前 5 行来自第一个 pdf 文件,则必须使用从第一个文件的标题中提取的相同日期填充第一列中的前 5 行。如果前 5 行之后的下 2 行来自第二个文件,则第一列中的这 2 行必须使用从第二个文件的标题中提取的相同日期填充。
我已经尝试过的
我已经从每个文件中提取了表格,加入并创建了一个 tibble,如下所示。甚至创建一个代码来提取日期。但实际上,我不知道如何将从标题中提取的日期与每个文件的表格内容相关联并将其插入到 tibble 中。
代码 - 提取表信息
## EXTRACT PDF FILE INFORMATION AND GENERATE A CLEAN DATASET
# load library
library(pdftools)
library(tidyverse)
# create a list with all file names
file_names <- dir(pattern = 'N.*')
# extract text from each file and append into a list
text_raw <- list()
for (i in 1:length(file_names)) {
doc <- pdf_text(file_names[i])
text_raw <- append(text_raw, doc)
}
# clean data
text_clean <- text_raw %>%
str_split('\r\n') %>%
unlist() %>%
as.vector() %>%
str_to_lower() %>%
str_squish() %>%
str_subset('1-bovespa') %>%
str_replace('1-', '') %>%
str_remove_all('#2?|on|nm|sa') %>%
str_squish()
# convert as tibble
df <- tbl_df(text_clean)
# split column
df <- separate(df,
value,
c('c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8'),
sep = ' ')
print(df)
代码 - 提取日期
# filter dates
dates <- text_raw %>%
str_split('\r\n') %>%
unlist() %>%
as.vector() %>%
str_squish() %>%
str_subset('\\d{4}\\s\\d{1}\\s\\d{2}\\/\\d{2}\\/\\d{4}$') %>%
str_remove_all('(\\d+\\s\\d{1}\\s)')
print(dates)
实际输出
c1 c2 c3 c4 c5 c6 c7 c8
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 bovespa c vista cielo 800 10,79 8.632,00 d
2 bovespa c vista cielo 200 10,79 2.158,00 d
3 bovespa c vista brf 400 23,81 9.524,00 d
4 bovespa c vista brf 100 23,81 2.381,00 d
预期输出
c1 c2 c3 c4 c5 c6 c7 c8 c9
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 10/01/2019 bovespa c vista cielo 800 10,79 8.632,00 d
2 10/01/2019 bovespa c vista cielo 200 10,79 2.158,00 d
3 18/01/2019 bovespa c vista brf 400 23,81 9.524,00 d
4 18/01/2019 bovespa c vista brf 100 23,81 2.381,00 d
有什么帮助吗?
【问题讨论】:
标签: r pdf dplyr extract text-mining