如何将使用pdf文件提取的日期与使用R提取的日期相关联?

时间:2019-05-19 18:06:46

标签: r pdf dplyr extract text-mining

我所拥有的

我有两个.pdf文件,每个文件的内部都有一个表,其中包含买卖股票信息以及每个页面右上角标题上的日期。请参阅文件here。如有必要,将下面的两个.pdf文件和脚本保存到计算机的同一文件夹中,然后运行脚本以重现问题。

我需要什么

我只想从每个文件中提取表内容,将其联接并转换为小标题,然后插入一个第一列(小标题),其中包含从头文件中提取的日期。

因此,如果小标题中的前5行来自第一个pdf文件,则必须用从第一个文件的标题中提取的相同日期填充第一列中的前5行。如果前5行之后的后2行来自第二个文件,则第一列中的这两行必须用从第二个文件的标题中提取的相同日期填充。

我已经尝试过的东西

我已经从每个文件中提取了表格,加入并创建了一个小标题,如下所示。甚至创建代码以提取日期。但实际上,我不知道如何将从标头提取的日期与每个文件的表内容相关联,并将其插入到标题中。

代码-提取表信息

# 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   

预期产量

{{1}}

有帮助吗?

2 个答案:

答案 0 :(得分:0)

我认为提取日期的工作不必要地复杂,更不用说它似乎对我们中的某些人有用,但对我的代码运行却失败了。相反,我构造了一个日期模式并使用stringi::stri_extract进行了提取:

 stringi::stri_extract( regex="[0-3][0-9]/[01][0-9]/20[0-1][0-9]", text_clean)
[1] "18/01/2019"  # this pattern designed for this century dates in the DD/MM/YYYY format

 dates <- stringi::stri_extract( regex="[0-3][0-9]/[01][0-9]/20[0-1][0-9]", text_clean)

 df$C9 <- dates

此外,由于每个pdf中的日期模式都有多个匹配项,因此在将文本附加到一起之前进行提取会比较安全,然后您只能使用第一个值。

答案 1 :(得分:-1)

df$c0=dates
print(df)

嗨,我是中国人。

enter image description here

您应该只重命名名称:

colnames(df)=c("c2","c3","c4","c5","c6","c7","c8","c9")
df$c1=dates
print(df)