【问题标题】:Error in writing data frame in R在 R 中写入数据帧时出错
【发布时间】:2018-03-06 00:05:43
【问题描述】:

我正在尝试从我从 OCR 格式的 pdf 文件中提取的文本中搜索一个单词。这个 pdf 文件有多个页面,所以对于每一页,我都在搜索那个词,如果找到那个词,那么写下 filenamestatus(存在或不存在) ,Page 找到它以及它找到了哪些 words 到数据框。但是数据框为所有文件提供“当前”状态,我只想这样

file_name       Status        Page              words
test1.pdf    "Present"       test1_2,test1_4    gym,school
test2.pdf    "Not Present"     -                 -
test3.pdf    "Present"       test3_1            gym

我在这段代码中遗漏了什么。

这里是代码

    All_files=Sys.glob("*.pdf")
v1 <- numeric(length(All_files))
chk_words=c("Swimming pool","Gym","west","para")
word <- "Gym"
tc=c()
ps=c()
x=list()
df <- data.frame()
Status="Present"

for (i in seq_along(All_files)){


  file_name <- All_files[i]

  cnt <- pdf_info(All_files[i])$pages
  print(cnt)

  for(j in seq_len(cnt)){
    img_file <- pdftools::pdf_convert(All_files[i], format = 'tiff', pages = j, dpi = 400)
    text <- ocr(img_file)
    ocr_text <- capture.output(cat(text))
    check <- sapply(ocr_text, paste, collapse="")
    junk <- dir(path="D:/Deepesh/R Script/All_PDF_Files/Registration_Certificates_OCR", pattern="tiff")
    file.remove(junk)
    br <-if(length(which(stri_detect_fixed(tolower(check),tolower(word)))) <= 0) "Not Present"  
    else "Present" 
    print(br)       
    if(br=="Present") {
      v1[i] <- j
      break}

    for(k in chk_words){ 
      br=if(length(which(stri_detect_fixed(tolower(check),tolower(k)))) <= 0){ print("Not Present") } else {print("Present")}
      if(br == "Present")
        ps=k
      x[[k]]=ps
      tc=unlist(unique(x))
    }




  }

  print(tc)
  Status <- if(v1[i] == 0) "Not Present" else "Present"
  pages <- if(v1[i] == 0) "-" else 
    paste0(tools::file_path_sans_ext(basename(file_name)), "_", v1[i])
  words <- if(v1[i] == 0) "-" else word
  df <- rbind(df, cbind(file_name = basename(file_name),
                        Status, pages = pages, words = words,tc))


}

任何建议都是可以理解的。

谢谢

【问题讨论】:

  • 看起来你是 rbind 仅当 br == "Present"
  • 是的,我只是想看看我是否至少能够放置那些状态为存在的记录。但对于每个页面和每个文件,它的状态都显示为“存在”
  • 你有一个嵌套循环。假设如果其中一页有“Present”,那么整个文档(即 pdf 文件)是否应该显示“Present”。在这种情况下,您可能需要提取“br”并使用allany 在内循环外部检查
  • 是的,我希望如果文档的任何页面有“存在”,那么文档状态应该更新为“存在”否则“不存在”
  • 所以,在这种情况下,试试这个建议。我无法检查,因为这不是可重现的示例

标签: r for-loop if-statement dataframe break


【解决方案1】:

这里是单个单词的选项

v1 <- numeric(length(All_files))
word <- "school"
df <- data.frame()
Status="Present"

for (i in seq_along(All_files)){


  file_name <- All_files[i]

    cnt <- pdf_info(All_files[i])$pages
    print(cnt)

    for(j in seq_len(cnt)){
      img_file <- pdftools::pdf_convert(All_files[i], format = 'tiff', pages = j, dpi = 400)
      text <- ocr(img_file)
      ocr_text <- capture.output(cat(text))
      check <- sapply(ocr_text, paste, collapse="")
      junk <- dir(path= paste0(path, "/tiff"), pattern="tiff")
      file.remove(junk)
      br <-if(length(which(stri_detect_fixed(tolower(check),tolower(word)))) <= 0) "Not Present"  
              else "Present" 
      print(br)       
      if(br=="Present") {
         v1[i] <- j
         break}

    }

    Status <- if(v1[i] == 0) "Not Present" else "Present"
    pages <- if(v1[i] == 0) "-" else 
     paste0(tools::file_path_sans_ext(basename(file_name)), "_", v1[i])
    words <- if(v1[i] == 0) "-" else word
    df <- rbind(df, cbind(file_name = basename(file_name),
              Status, pages = pages, words = words))


}

-输出

df
#     file_name      Status  pages  words
#1 Amenities.pdf Not Present      -      -
#2      test.pdf     Present test_2 school

【讨论】:

  • @deepesh 关于您正在搜索的单词。你有单词列表吗?
  • 现在有105个字,以后可以增加,现在我们可以去学校,学院,健身房,游泳池。
  • @deepesh 我更新了一个单词大小写,但我仍然不确定您如何循环文档中的多个单词以及预期输出的样子
  • 是的,问题是我们如何才能得到匹配的单词,而且也可能有多个单词,再次用预期的答案更新我的帖子
  • 你贴的代码,能不能超过两个词(现在我们在搜索学校,,我们可以搜索“gym”和“school”)...忘记计算“页面”列来自代码/
猜你喜欢
  • 1970-01-01
  • 2017-11-08
  • 2020-05-02
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
相关资源
最近更新 更多