1

我正在编写一个循环脚本,该脚本涉及从工作簿中读取文件(使用包 XLConnect)。挑战在于文件名包含我想忽略的字符(代表时间)。

例如,以下是这些文件的 3 个路径:

G://User//Documents//daily_data//Op_Schedule_20160520_132025.xlsx G://User//Documents//daily_data//Op_Schedule_20160521_142805.xlsx G://User//Documents//daily_data//Op_Schedule_20160522_103052.xlsx

我需要导入数百个这些文件。我可以很容易地解释代表日期的字符串(例如 20160522),而不是时间。

有没有办法告诉 R 忽略文件路径中的某些字符?以下是我对编写脚本的想法(“???”是我需要帮助的地方)。我知道循环可能不是最有效的方法,但如果您有任何建议,我愿意接受:

require(XLConnect)
path= "G://User//Documents//daily_data//Op_Schedule_"

wd.seq = format(seq(as.Date("2014-01-01"),as.Date("2016-12-31"),"days"),format="%Y%m%d")

scheduleList = rep(list(matrix(1,1,1)),length(wd.seq))

for(i in 1:length(wd.seq)) { 
wb = loadWorkbook(file= paste0(path,wd.seq[i],"???",".xlxs"))
scheduleList[[i]] = readWorksheet(wb,sheet='=SCHEDULE', header = TRUE)
}

`

感谢您的阅读和建议,如果有的话。

马修

4

1 回答 1

1

我不知道这是否有帮助,但是如果您想读取某个目录中的所有文件(在我看来这就是您所追求的),您可以使用列表将所有文件名读入列表中。 files() 函数,例如

fileList <- list.files(""G://User//Documents//daily_data//")

然后使用 for 循环加载循环遍历列表的 xlsx 文件

for(i in fileList) {
    loadWorkbook(file = i)
    }

我以前没有使用过 XLConnect 函数,因此确切的代码可能不起作用,但是循环将遍历该目录中的所有文件,因此您可以使用 i 变量作为文件名来构造加载调用(它不会t 是绝对路径,因此您可能需要使用 paste 添加文件路径的第一部分)

我意识到目录中可能有其他文件不是 excel 文件,您可以使用 grepl 仅选择包含“OP_Schedule_”的文件

fileListClean <- fileList[grepl("Op_Schedule_",fileList)]

或者可能只选择目录中的 .xlsx 文件:

fileListClean <- fileList[grepl(".xlsx",fileList)]

编辑以适合您的回复: 由于您需要将其与序列相匹配,您可以像之前一样进行操作:

wd.seq = format(seq(as.Date("2014-01-01"),as.Date("2016-12-31"),"days"),format="%Y%m%d")
wd.seq2 <- paste("Op_Schedule_", wd.seq, sep = "")

然后使用 grepl 仅选择以该扩展名开头的文件:

fileListClean <- fileList[grepl(paste(wd.seq2, collapse = "|"), fileList)]

完全披露:我从这个 SO 答案中得到的最后一部分:grep using a character vector with multiple patterns

于 2016-05-30T19:44:25.380 回答