如何在R语言中用tidyverse批量删除旧数据集文件
R语言自动清理数据集:保留最新3个文件,删除旧文件
需求说明
需要自动清理两类数据集文件(viewers by app和log metrics),仅保留每个类别下最新的3个文件,通过文件名中%Y%m%d%H%M格式的时间戳判断文件新旧,借助tidyverse生态工具实现。
解决方案
我们可以用fs包(tidyverse生态内的文件操作工具)结合dplyr来实现这个逻辑,步骤如下:
- 编写通用清理函数,传入文件前缀和目标路径,自动筛选并删除旧文件
- 分别调用函数处理两类文件
完整代码
library(tidyverse) library(fs) # 定义清理函数:保留最新n个文件,删除其余旧文件 clean_old_files <- function(file_prefix, target_dir, keep_n = 3) { # 1. 获取目标路径下所有匹配前缀的csv文件 files <- dir_ls(target_dir, regexp = paste0("^", file_prefix, ".*\\.csv$")) if (length(files) <= keep_n) { message(paste("文件数量不足", keep_n, "个,无需清理")) return(invisible(NULL)) } # 2. 提取文件名中的时间戳并转换为时间格式 file_info <- files %>% as_tibble_col(column_name = "file_path") %>% mutate( file_name = path_file(file_path), # 提取时间戳部分:从前缀之后到.csv之前的字符串 timestamp_str = str_remove(file_name, paste0("^", file_prefix)), timestamp_str = str_remove(timestamp_str, "\\.csv$"), # 转换为时间对象用于排序 timestamp = ymd_hm(timestamp_str) ) %>% # 按时间戳倒序排列(最新的在前) arrange(desc(timestamp)) # 3. 筛选出需要删除的文件(除了前keep_n个) files_to_delete <- file_info %>% slice((keep_n + 1):n()) %>% pull(file_path) # 4. 删除文件(测试阶段可替换为print(files_to_delete)确认目标文件) file_delete(files_to_delete) message(paste("已删除", length(files_to_delete), "个旧文件")) } # 调用函数处理两类文件 clean_old_files(file_prefix = "log_metrics", target_dir = "data/generated_metrics") clean_old_files(file_prefix = "viewers by app", target_dir = "data/generated_metrics")
关键逻辑说明
dir_ls:批量获取目标路径下匹配前缀的文件,避免手动遍历str_remove:精准提取文件名中的时间戳字符串,与生成文件时的%Y%m%d%H%M格式对应ymd_hm:将时间戳字符串转换为可排序的时间对象,确保新旧判断准确slice:跳过前3个最新文件,筛选出所有待删除的旧文件file_delete:执行删除操作,测试阶段建议先用print确认待删文件无误
注意事项
- 确保
target_dir路径与生成文件时的路径完全一致 - 生成文件的时间戳格式必须和函数中
ymd_hm的解析格式匹配(当前为年月日时分) - 首次运行建议注释
file_delete,用print验证待删文件列表
内容的提问来源于stack exchange,提问作者GaB
相关产品推荐
相关产品推荐

