在目录中导入最新的csv文件

时间:2014-07-28 16:56:45

标签: r csv import automation directory

目标:
- 将最新文件(.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)

非常感谢你提前帮忙! : - )

3 个答案:

答案 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(.)))