我正在尝试使用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日在 文本 笔录中的一堆文字”
我得到的是错误消息“下标超出范围”。我不知道这是什么意思。就像我说的那样,它只能在单个文件上工作,但不能在循环中工作。感谢您提供的所有帮助。
答案 0 :(得分:0)
这与您没有通过[, 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()
调用会找到它们,它就可以工作。