【问题标题】:How to associate a date extracted from a pdf file with the data extracted from it using R?如何将从 pdf 文件中提取的日期与使用 R 从中提取的数据相关联?
【发布时间】: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


    【解决方案1】:

    我认为提取日期的工作过于复杂,更不用说它似乎对我们中的一些人有效,但在我运行代码时却失败了。相反,我构建了一个日期模式并使用 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 中的日期模式有多个匹配项,因此在将文本附加在一起之前进行提取会更安全,然后您只能使用第一个值。

    【讨论】:

    • 感谢您的建议。我会在附加之前检查提取。
    • 我认为提取日期代码不起作用,因为需要加载 pdftoolstidyverse 库。您的代码运行良好,但提取的日期比我们需要的多,因为要提取的文件是 text_raw 而不是 text_clean。最后一个没有日期。谢谢@42-。
    【解决方案2】:
    df$c0=dates
    print(df)
    

    嗨,我是中国人。

    你应该重命名 colname :

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

    【讨论】:

    • 这不能回答问题,因为日期的值是character(0)(更不用说这个答案的其他几个问题了。)
    • 只需将 colname 重命名为:colnames(df)=c("c2","c3","c4","c5","c6","c7","c8"," c9") df$c1=日期打印(df)
    • 感谢您的帮助,@lyq。不要担心列类为character(0)。在那种情况下没关系。我按照您的建议插入代码行df$c0=dates,但日期是随机填写的。因此,从第二个文件中提取的某些日期与来自第一个文件的行相关联,这对于解决此问题是不可接受的。想象一下要提取 1,000 个文件。如何将文件中的日期完全插入从同一文件中提取的相同行中?我正在寻找可重现的代码。还是谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多