在R中实现文件名列表中月份名称转数值的函数(含字典映射)
解决方案:用命名向量实现月份替换并重构文件名
完全可以用命名向量(即你所说的“字典”)来实现这个需求,以下是具体实现代码和说明:
1. 定义基础数据与映射规则
保留你原始的文件名列表和月份映射向量:
library(stringr) # 原始文件名列表 f <- c("cm18OCT2023.csv", "cm22NOV2023.csv") # 月份名称到数字的映射(命名向量) month_text <- c( "JAN" = "01", "FEB" = "02", "MAR" = "03", "APR" = "04", "MAY" = "05", "JUN" = "06", "JUL" = "07", "AUG" = "08", "SEP" = "09", "OCT" = "10", "NOV" = "11", "DEC" = "12" )
2. 实现文件名转换函数
编写函数,通过正则匹配提取文件名中的日、月份、年份,结合命名向量替换月份后重构目标格式:
rename_files <- function(file_names, month_map) { # 正则捕获:提取日(dd)、月份(MMM)、年份(yyyy) pattern <- "^cm(\\d{2})([A-Z]{3})(\\d{4})\\.csv$" str_replace_all(file_names, pattern, function(match) { dd <- str_match(match, pattern)[,2] mmm <- str_match(match, pattern)[,3] yy <- str_sub(str_match(match, pattern)[,4], 3, 4) mm <- month_map[mmm] paste0(yy, mm, dd, ".csv") }) }
3. 调用函数生成结果
newnames <- rename_files(f, month_text) print(newnames) # 输出:[1] "231018.csv" "231122.csv"
简化实现方案
如果文件名格式固定,也可以先替换月份再直接提取拼接:
# 先替换文件名中的月份为数字 temp_names <- str_replace_all(f, month_text) # 提取对应部分拼接成目标格式 newnames <- paste0( str_sub(temp_names, 8, 9), # 年份后两位 str_sub(temp_names, 5, 6), # 替换后的月份数字 str_sub(temp_names, 3, 4), # 日 ".csv" )
关键说明
- 命名向量
month_text完美适配“字典”需求,str_replace_all可直接用它完成匹配替换 - 正则匹配的方式更鲁棒,能避免因字符串位置变动导致的错误
- 函数化实现可直接复用在任意同格式的文件名列表上
内容的提问来源于stack exchange,提问作者ambrish dhaka
相关产品推荐
相关产品推荐

