忽略 readtext r 中的错误
Ignore errors in readtext r
我现在正尝试使用 readtext 提取放置在一个文件夹中的大量 docx 文件 (1500)(在使用 list.files 创建列表后)
您可以在这里找到类似的例子:https://cran.r-project.org/web/packages/readtext/vignettes/readtext_vignette.html
我遇到一些文件错误(如下示例),问题是发生此错误时,提取过程已停止。我可以通过更改 verbosity = 3
来识别有问题的文件,但随后我必须重新启动提取过程(以找到另一个有问题的文件)。
我的问题是,如果遇到错误,是否有办法避免中断进程?
我更改了 ignore_missing_files = TRUE
但这并没有解决问题。
遇到的错误示例:
write error in extracting from zip file
Error: 'C:\Users--- c/word/document.xml' does not exist.
抱歉没有 post 一个可重现的例子,但我不知道如何 post 一个带有大 docx 文件的例子。但这是代码:
library(readtext)
data_files <- list.files(path = "PATH", full.names = T, recursive = T) # PATH = the path to the folder where the documents are located
extracted_texts <- readtext(data_files, docvarsfrom = "filepaths", dvsep = "/", verbosity = 3, ignore_missing_files = TRUE) # this is to extract the text in the files
write.csv2(extracted_texts, file = "data/text_extracts.csv", fileEncoding = "UTF-8") # this is to export the files into csv
让我们先整理一个可重现的例子:
download.file("https://file-examples-com.github.io/uploads/2017/02/file-sample_1MB.docx", "test1.docx")
writeLines("", "test2.docx")
我在这里生成的第一个文件应该是一个正确的docx文件,第二个是垃圾。
我会将 readtext
包装在一个处理错误和警告的小函数中:
readtext_safe <- function(f) {
out <- tryCatch(readtext::readtext(f),
error = function(e) "fail",
warning = function(e) "fail")
if (isTRUE("fail" == out)) {
write(f, "errored_files.txt", append = TRUE)
} else {
return(out)
}
}
请注意,我对错误和警告的处理方式相同,这可能不是您真正想要的。我们可以使用这个函数来遍历你的文件:
files <- list.files(pattern = ".docx$", ignore.case = TRUE, full.names = TRUE)
x <- lapply(files, readtext_safe)
x
#> [[1]]
#> readtext object consisting of 1 document and 0 docvars.
#> # Description: df[,2] [1 × 2]
#> doc_id text
#> <chr> <chr>
#> 1 test1.docx "\"Lorem ipsu\"..."
#>
#> [[2]]
#> NULL
在结果列表中,失败的文件只有一个 NULL
条目,因为不会返回任何内容。我喜欢写出这些错误文件的列表,上面的函数创建一个 txt 文件,如下所示:
readLines("errored_files.txt")
#> [1] "./test2.docx"
我现在正尝试使用 readtext 提取放置在一个文件夹中的大量 docx 文件 (1500)(在使用 list.files 创建列表后)
您可以在这里找到类似的例子:https://cran.r-project.org/web/packages/readtext/vignettes/readtext_vignette.html
我遇到一些文件错误(如下示例),问题是发生此错误时,提取过程已停止。我可以通过更改 verbosity = 3
来识别有问题的文件,但随后我必须重新启动提取过程(以找到另一个有问题的文件)。
我的问题是,如果遇到错误,是否有办法避免中断进程?
我更改了 ignore_missing_files = TRUE
但这并没有解决问题。
遇到的错误示例:
write error in extracting from zip file
Error: 'C:\Users--- c/word/document.xml' does not exist.
抱歉没有 post 一个可重现的例子,但我不知道如何 post 一个带有大 docx 文件的例子。但这是代码:
library(readtext)
data_files <- list.files(path = "PATH", full.names = T, recursive = T) # PATH = the path to the folder where the documents are located
extracted_texts <- readtext(data_files, docvarsfrom = "filepaths", dvsep = "/", verbosity = 3, ignore_missing_files = TRUE) # this is to extract the text in the files
write.csv2(extracted_texts, file = "data/text_extracts.csv", fileEncoding = "UTF-8") # this is to export the files into csv
让我们先整理一个可重现的例子:
download.file("https://file-examples-com.github.io/uploads/2017/02/file-sample_1MB.docx", "test1.docx")
writeLines("", "test2.docx")
我在这里生成的第一个文件应该是一个正确的docx文件,第二个是垃圾。
我会将 readtext
包装在一个处理错误和警告的小函数中:
readtext_safe <- function(f) {
out <- tryCatch(readtext::readtext(f),
error = function(e) "fail",
warning = function(e) "fail")
if (isTRUE("fail" == out)) {
write(f, "errored_files.txt", append = TRUE)
} else {
return(out)
}
}
请注意,我对错误和警告的处理方式相同,这可能不是您真正想要的。我们可以使用这个函数来遍历你的文件:
files <- list.files(pattern = ".docx$", ignore.case = TRUE, full.names = TRUE)
x <- lapply(files, readtext_safe)
x
#> [[1]]
#> readtext object consisting of 1 document and 0 docvars.
#> # Description: df[,2] [1 × 2]
#> doc_id text
#> <chr> <chr>
#> 1 test1.docx "\"Lorem ipsu\"..."
#>
#> [[2]]
#> NULL
在结果列表中,失败的文件只有一个 NULL
条目,因为不会返回任何内容。我喜欢写出这些错误文件的列表,上面的函数创建一个 txt 文件,如下所示:
readLines("errored_files.txt")
#> [1] "./test2.docx"