目标:
- 将最新文件(.csv)从本地目录导入R
目标明细:
- 我的Mac上每天都会将csv文件上传到一个文件夹。我希望能够在我的R脚本中加入一个函数,该函数自动将最新文件导入我的工作区以进行进一步分析。该文件每天上午4:30左右上传
- 我希望这个功能在早上运行(不早于早上6点,所以这里有足够的时间留有余地)
输入详情:
- 文件类型:.csv
- 命名约定:示例文件名:“2014年7月28日04:37:47 -0400.csv”
- 频率:每日导入@~04:30
我尝试过的事情:
- 我知道这似乎是一个微弱的尝试,但我真的不知道如何在下面修改这个功能
- 我在纸面上的想法是“抓住”最新文件的ID,而不是粘贴()它在目录名称前面,然后是中提琴! (但是我的编程技巧很难在这里编写代码)
- 下面的代码试图运行,但它只是“挂起”而没有完成。我从这个R forum found here
代码:
lastChange = file.info(directory)$mtime
while(TRUE){
currentM = file.info(directory)$mtime
if(currentM != lastChange){
lastChange = currentM
read.csv(directory)
}
# try again in 10 minutes
Sys.sleep(600)
}
我的环境:
- R 3.1
- Mac OS X 10.9.4(Mavericks)
非常感谢你提前帮忙! : - )
答案 0 :(得分:4)
- readfile.R -
files <- file.info(list.files(directory))
read.csv(rownames(files)[order(files$mtime)][nrow(files)])
我将上面的脚本放在一个cron作业中,该作业每天早上都会写入当天的文件。下面的crontab每天早上8点运行它。
- 在crontab中 -
0 8 * * * Rscript readfile.R
了解有关cron here的更多信息。
答案 1 :(得分:1)
以下函数使用时间戳文件来“跟踪”使用时间戳文件处理的文件。它既可以在R实例中连续运行(如您最初建议的那样),也可以通过单运行实例运行,借助@andrew建议的cron作业。 (cat()
命令主要用于测试;随意将其删除。)
processDir <- function(directory = '.', pattern = '*.csv', loop = FALSE, delay = 600,
stampFile = file.path(directory, '.csvProcessor')) {
if (! file.exists(stampFile))
file.create(stampFile)
firstRun <- TRUE
while (firstRun || loop) {
firstRun <- FALSE
stampTime <- file.info(stampFile)$mtime
allFilesDF <- file.info(list.files(path = directory, pattern = pattern,
full.names = TRUE, no.. = TRUE))
unprocessedFiles <- allFilesDF[(! allFilesDF$isdir) &
(allFilesDF$mtime > stampTime), ]
if (nrow(unprocessedFiles)) {
## We need to update the timestamp on stampFile quickly so
## that files added while this is running will be found in the
## next loop.
## WARNING: this blindly truncates the stampFile.
file.create(stampFile, showWarnings = FALSE)
for (fn in rownames(unprocessedFiles)) {
cat('Processing ', fn, '\n')
## read.csv(fn)
## ...
}
}
if (loop) Sys.sleep(delay)
}
}
正如您最初建议的那样,在连续运行的R实例中运行它只会是:
processDir(loop = TRUE)
要使用@ andrew建议的cron作业,请在函数定义后附加以下行:
processDir()
...并使用类似于以下内容的crontab文件:
# crontab
0 8 * * * path/to/Rscript path/to/processDir.R
希望这有帮助。
答案 2 :(得分:0)
使用dplyr
/ magrittr
pacman::p_load(magrittr)
path <- list.files(path = directory,
pattern = "csv$",
full.names = TRUE) %>%
extract(which.max(file.mtime(.)))