我正在尝试从i个标准化的.txt文件中提取/导出i个标准化实例的文本,并将其转换为每个实例为一行的数据框。然后我想将这些数据导出为.xlsx文件。到目前为止,我可以成功提取数据(尽管算法提取的数据比gregexpr()参数规定的略多),但只能以文本块的形式导出为.txt文件。
- 如何创建一个数据框,其中每个提取的.txt文件的文本实例都有一行?(一旦数据处于data.frame格式,我知道如何从那里导出为xlsx。)
- 如何仅提取我设定的参数内的数据?
在帮助下(特别是来自此帖评论中的Ben),这是我目前所做的:
# Txt Data Formattxt 1 <-"A. The First: abcdefg hijklmnop qrstuv wxyz. B. The Second: abcdefg hijklmnop qrstuv wxyz. C. The Third: abcdefg hijklmnop qrstuv wxyz. D. The Fourth: abcdefg hijklmnop qrstuv wxyz. A. The First: abcdefg hijklmnop qrstuv wxyz. B. The Second: abcdefg hijklmnop qrstuv wxyz. C. The Third: abcdefg hijklmnop qrstuv wxyz. D. The Fourth: abcdefg hijklmnop qrstuv wxyz."txt 2 <-"A. The First: abcdefg hijklmnop qrstuv wxyz. B. The Second: abcdefg hijklmnop qrstuv wxyz. C. The Third: abcdefg hijklmnop qrstuv wxyz. D. The Fourth: abcdefg hijklmnop qrstuv wxyz. A. The First: abcdefg hijklmnop qrstuv wxyz. B. The Second: abcdefg hijklmnop qrstuv wxyz. C. The Third: abcdefg hijklmnop qrstuv wxyz. D. The Fourth: abcdefg hijklmnop qrstuv wxyz."################################## Directory and Text Extraction ##################################dest <- "C:/Desktop/"docs_text <- list.files(path = dest, pattern = "txt", full.names = TRUE)## Assumes that all the content I want to extract is between "A." and "C." in ## the text while ignoring "C." and "D." content.docs_list <- list.files(path = dest, pattern = "txt", full.names = TRUE)docs_doc <- lapply(docs_list, function(i) { j <- paste0(scan(i, what = character()), collapse = " ") regmatches(j, gregexpr("(?<=A. The First).*?(?=C. The Third)", j, perl=TRUE))})lapply(1:length(docs_doc), function(i) write.table(docs_doc[i], file=paste(docs_list[i], " ", " ", sep="."), quote = FALSE, row.names = FALSE, col.names = FALSE, eol = " " ))
当前输出看起来像这样,其中所有文本都在一行上,并且捕获的内容超出了”A.”和”C.”之间的范围:
期望的输出应如下所示,其中仅捕获”A.”和”C.”之间的多行文本,并且每个多行捕获被分配为一行实例:
任何你能提供的帮助都将非常有用!
我最终的目标是开发一个NLP模型,能够从数百个大型PDF中提取标准化表格数据,用于年度存储库。如果此帖子表明我没有有效/高效地思考如何解决这个问题,我愿意接受指导。
提前感谢!
回答:
我使用dplyr
来利用tibble
对象的便利性和非常有效的bind_rows
命令:
dest <- "~"docs_text <- list.files(path = dest, pattern = "txt", full.names = TRUE)library(dplyr)docs_df <- lapply(docs_text, function(f) { lines <- readLines(f) tibble( file = basename(f), line = seq_along(lines), text = lines ) }) %>% bind_rows()
一旦你有了正确的data.frame
,使用filter
和grepl
来查找匹配的文本就很容易了。我使用正则表达式"^A.|^B."
来查找以A.或B.开头的行:
docs_df %>% filter(grepl("^A.|^B.", text))#> # A tibble: 8 x 3#> file line text #> <chr> <int> <chr> #> 1 txt_1.txt 1 A. The First: abcdefg hijklmnop qrstuv wxyz.#> 2 txt_1.txt 2 B. The Second: abcdefg hijklmnop qrstuv wxyz.#> 3 txt_1.txt 6 A. The First: abcdefg hijklmnop qrstuv wxyz.#> 4 txt_1.txt 7 B. The Second: abcdefg hijklmnop qrstuv wxyz.#> 5 txt_2.txt 1 A. The First: abcdefg hijklmnop qrstuv wxyz.#> 6 txt_2.txt 2 B. The Second: abcdefg hijklmnop qrstuv wxyz.#> 7 txt_2.txt 6 A. The First: abcdefg hijklmnop qrstuv wxyz.#> 8 txt_2.txt 7 B. The Second: abcdefg hijklmnop qrstuv wxyz.
对于导出到Excel,我推荐使用rio::export()
。