如何基于版本号筛选文件夹文件并提取各文档的最终草稿?
解决思路与实现代码
要筛选每个文档的最终草稿(罗马数字版本最高的文件),核心是先拆分文件名提取文档标识和版本号,再将罗马数字转为阿拉伯数字以便比较大小,最后按文档分组筛选最大值。以下是具体实现步骤:
步骤1:获取文件列表
用list.files()获取目标文件夹下所有.txt文件:
# 替换为你的文件夹路径 files <- list.files(path = "./your_folder", pattern = "\\.txt$", full.names = FALSE)
步骤2:解析文件名并转换版本号
首先需要把文件名里的罗马数字版本转成阿拉伯数字(方便比较大小),然后拆分出每个文件对应的文档ID:
# 罗马数字转阿拉伯数字的工具函数(含错误处理) roman_to_num <- function(roman_str) { tryCatch({ as.integer(as.roman(roman_str)) }, error = function(e) { warning(paste("跳过无效罗马数字文件:", roman_str)) NA }) } # 去掉文件名的.txt后缀 file_names_no_ext <- sub("\\.txt$", "", files) # 按下划线拆分文件名 split_names <- strsplit(file_names_no_ext, "_") # 提取文档ID(前3段:比如A_COR_001)和罗马版本号 doc_ids <- sapply(split_names, function(x) paste(x[1:3], collapse = "_")) versions <- sapply(split_names, function(x) x[4]) # 整理成数据框,方便后续分组处理 file_df <- data.frame( file = files, doc_id = doc_ids, version_num = sapply(versions, roman_to_num), stringsAsFactors = FALSE ) # 移除版本号无效的文件(可选) file_df <- file_df[!is.na(file_df$version_num), ]
步骤3:分组筛选最终草稿
可以用基础R或dplyr包实现分组筛选,两种方式任选:
方式1:基础R实现
# 按文档ID分组,选出每个组里版本号最大的文件 final_drafts <- aggregate( file ~ doc_id, data = file_df, FUN = function(x) { # 找到当前组内版本号最大的对应文件 x[which.max(file_df$version_num[file_df$file %in% x])] } ) # 提取最终的文件名列表 final_draft_files <- final_drafts$file
方式2:dplyr包实现(更简洁)
library(dplyr) final_draft_files <- file_df %>% group_by(doc_id) %>% filter(version_num == max(version_num)) %>% pull(file)
验证结果
运行后final_draft_files就是每个文档的最终草稿文件名,比如会包含A_COR_001_II、A_COR_002_II、A_COR_003_III、A_COR_004_IV等。
内容的提问来源于stack exchange,提问作者eazyezy
相关产品推荐
相关产品推荐

