如何在R中使用fread读取带时间戳的最新数据集?
自动读取带时间戳的最新数据集(支持日期/时间戳判断)
下面提供两种实用的实现方式,都能自动识别文件名中的时间戳(不管是日度带时分的log_metricsYYYYMMDDHHMM,还是未来的月度log_metricsYYYYMM格式),并读取最新的文件:
方法一:Base R + data.table
无需额外安装包,用基础R函数结合data.table::fread即可实现:
library(data.table) # 定义目标文件夹路径 dir_path <- "data/generated_metrics/" # 筛选出符合命名规则的文件(log_metrics开头,后跟纯数字时间戳) metric_files <- list.files( path = dir_path, pattern = "^log_metrics\\d+$", full.names = TRUE ) # 空文件检查,避免无匹配文件时报错 if (length(metric_files) == 0) { stop("目标文件夹中未找到符合规则的数据集文件") } # 解析文件名中的时间戳为可比较的日期/时间对象 parse_timestamp <- function(ts) { n_char <- nchar(ts) switch( as.character(n_char), "6" = as.Date(paste0(ts, "01"), format = "%Y%m%d"), # 月度格式YYYYMM "8" = as.Date(ts, format = "%Y%m%d"), # 日度格式YYYYMMDD "12" = as.POSIXct(ts, format = "%Y%m%d%H%M", tz = "UTC"), # 时分格式YYYYMMDDHHMM stop("不支持的时间戳长度:", n_char) ) } # 提取时间戳并转换格式 timestamps <- sub("^log_metrics(\\d+)$", "\\1", basename(metric_files)) file_dates <- sapply(timestamps, parse_timestamp) # 定位最新文件并读取 latest_file <- metric_files[which.max(file_dates)] latest_data <- fread(latest_file)
方法二:fs包(更简洁的文件操作)
fs包提供了更直观的文件系统操作函数,代码可读性更强:
library(fs) library(data.table) library(stringr) dir_path <- "data/generated_metrics/" # 筛选符合规则的文件 metric_files <- dir_ls(dir_path, regexp = "^log_metrics\\d+$") if (length(metric_files) == 0) { stop("未找到匹配的数据集文件") } # 复用时间戳解析函数 parse_timestamp <- function(ts) { n_char <- nchar(ts) switch( as.character(n_char), "6" = as.Date(paste0(ts, "01"), format = "%Y%m%d"), "8" = as.Date(ts, format = "%Y%m%d"), "12" = as.POSIXct(ts, format = "%Y%m%d%H%M", tz = "UTC"), stop("不支持的时间戳长度:", n_char) ) } # 提取时间戳并转换 timestamps <- path_file(metric_files) %>% str_remove("^log_metrics") file_dates <- sapply(timestamps, parse_timestamp) # 读取最新文件 latest_file <- metric_files[which.max(file_dates)] latest_data <- fread(latest_file)
注意事项
- 若未来新增其他时间戳格式(比如
YYYYMMDDHH),只需在parse_timestamp函数中添加对应的长度判断和格式转换规则即可 - 代码基于文件名中的时间戳判断新旧,而非文件的系统修改时间,完全符合"结合日期和时间戳判断"的要求
- 加入了空文件检查逻辑,避免因文件夹无匹配文件导致的运行错误
内容的提问来源于stack exchange,提问作者GaB
相关产品推荐
相关产品推荐

