我正在尝试使用str_extract_all从多个文本文件中提取日期信息。如果我做一个单独的文件,它工作得很好。但是,当我把它放到for循环中时,它给出了这个错误。
我已经尝试了“任何时间”,但它不起作用,其他任何基本的时间提取工具都不起作用。
下面是代码中给我带来麻烦的部分:
file.names <- list.files(path = "C:/Users/jwils/Documents/R/win-library/3.6/CNN_files/AC360", pattern = "txt$")
for(i in 1:length(file.names)){
named <- read.table(file.names[i], header=FALSE, sep="", fill = TRUE)
renamed <- corpus(file.names[i])
date <- str_extract_all(texts(renamed)
, "(\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Oct(?:ober)?|Dec(?:ember)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|(\\b(?:JAN(?:UARY)?|FEB(?:RUARY)?|MAR(?:CH)?|APR(?:IL)?|MAY|JUN(?:E)?|JUL(?:Y)?|AUG(?:UST)?|SEP(?:TEMBER)?|NOV(?:EMBER)?|OCT(?:OBER)?|DEC(?:EMBER)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\\s+\\d{1,2},\\s+\\d{4})|(\\b(JAN(UARY)?|FEB(RUARY)?|MAR(CH)?|APR(IL)?|MAY|JUN(E)?|JUL(Y)?|AUG(UST)?|SEP(TEMBER)?|OCT(OBER)?|NOV(EMBER)?|DEC(EMBER)?)\\s+\\d{1,2},\\s+\\d{4})"
, simplify = TRUE)[,1]
}我希望这段代码能从一系列文本文件中提取日期,
“于2018年12月12日在Text上播出一组文字记录”
我得到的是一条错误消息,“下标越界”。我不知道这是什么意思。正如我所说的,它在单个文件上工作,但不是在循环中。感谢您的帮助。
发布于 2019-07-10 23:02:22
这与您没有通过[, 1]索引操作获得预期的结果有关。如果其中一个文件不包含匹配项,那么对于循环,它将返回一个空标量,该标量无法以这种方式进行索引。
这里有一种更简单的方法:使用readtext输入文件。
library("quanteda")
library("stringr")
corp <- readtext::readtext("C:/Users/jwils/Documents/R/win-library/3.6/CNN_files/AC360/*.txt") %>%
corpus()
docvars(corp, "date") <-
str_extract_all(texts(corp),
"(\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Oct(?:ober)?|Dec(?:ember)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|(\\b(?:JAN(?:UARY)?|FEB(?:RUARY)?|MAR(?:CH)?|APR(?:IL)?|MAY|JUN(?:E)?|JUL(?:Y)?|AUG(?:UST)?|SEP(?:TEMBER)?|NOV(?:EMBER)?|OCT(?:OBER)?|DEC(?:EMBER)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\\s+\\d{1,2},\\s+\\d{4})|(\\b(JAN(UARY)?|FEB(RUARY)?|MAR(CH)?|APR(IL)?|MAY|JUN(E)?|JUL(Y)?|AUG(UST)?|SEP(TEMBER)?|OCT(OBER)?|NOV(EMBER)?|DEC(EMBER)?)\\s+\\d{1,2},\\s+\\d{4})"
simplify = TRUE)[, 1]
# to verify
summary(corp)这会将日期作为新的文档变量分配给您的语料库。如果你愿意,你也可以只将它们赋值给一个向量(例如date)。
我没有您的任何原始文件,因此不能保证这将工作,但我只要您有日期在您的文本文件和readtext()调用找到他们,它应该可以工作。
https://stackoverflow.com/questions/56945046
复制相似问题