R语言按复杂规则批量转换向量字符串的简便实现方法
R语言自定义文件名向量转换实现方案
通过正则表达式捕获组直接提取文件名中所有需要的字段,再按目标格式拼接即可,无需逐位计数,可自动适配code字段为1位/2位的场景。
方法1:基础R实现(无需安装额外包)
# 加载原始数据 all.images <-c("S2A2A_20160615_124_AguaSumidaPR001120160629_BOA_10.tif", "S2A2A_20160705_124_AguaSumidaPR0011020160629_BOA_10.tif", "S2A2A_20160712_081_AguaSumidaPR001120160629_BOA_10.tif", "S2A2A_20170501_124_AguaSumidaPR001120170427_BOA_10.tif", "S2A2A_20170508_081_AguaSumidaPR001120170427_BOA_10.tif") # 定义正则匹配规则,按顺序捕获6个目标字段 match_pattern <- "^S2A2A_(20\\d{6})_(\\d{3})_([A-Za-z]+)(PR\\d{3})(\\d+)(20\\d{6})_BOA_\\d+\\.tif$" # 提取所有分组为数据框 file_info <- strcapture( pattern = match_pattern, x = all.images, proto = list( sensor_date = character(), orbit = character(), site_name = character(), pr_code = character(), num_code = character(), prod_date = character() ) ) # 将产品日期格式化为yyyy-mm-dd格式 file_info$prod_date_fmt <- paste0( substr(file_info$prod_date, 1, 4), "-", substr(file_info$prod_date, 5, 6), "-", substr(file_info$prod_date, 7, 8) ) # 按要求拼接为新向量 all.images.new <- paste0( file_info$site_name, "_", file_info$pr_code, "_", file_info$num_code, "_", file_info$prod_date_fmt, "_", file_info$sensor_date, "_", file_info$orbit )
运行后输出结果完全匹配目标格式:
> all.images.new [1] "AguaSumida_PR001_1_2016-06-29_20160615_124" [2] "AguaSumida_PR001_10_2016-06-29_20160705_124" [3] "AguaSumida_PR001_1_2016-06-29_20160712_081" [4] "AguaSumida_PR001_1_2017-04-27_20170501_124" [5] "AguaSumida_PR001_1_2017-04-27_20170508_081"
方法2:stringr包实现(代码更简洁)
如果已安装tidyverse系列工具包,可使用str_match简化提取逻辑:
library(stringr) # 原始数据定义与方法1一致 all.images <-c("S2A2A_20160615_124_AguaSumidaPR001120160629_BOA_10.tif", "S2A2A_20160705_124_AguaSumidaPR0011020160629_BOA_10.tif", "S2A2A_20160712_081_AguaSumidaPR001120160629_BOA_10.tif", "S2A2A_20170501_124_AguaSumidaPR001120170427_BOA_10.tif", "S2A2A_20170508_081_AguaSumidaPR001120170427_BOA_10.tif") match_res <- str_match(all.images, match_pattern) all.images.new <- paste0( match_res[,4], "_", match_res[,5], "_", match_res[,6], "_", str_replace(match_res[,7], "(\\d{4})(\\d{2})(\\d{2})", "\\1-\\2-\\3"), "_", match_res[,2], "_", match_res[,3] )
说明:原始输入中第二个文件名的
AguaSumidaPR0010120160629段存在笔误,若要得到code=10的输出,该段应为AguaSumidaPR0011020160629(PR001后为10而非01),否则会提取到code=01,与目标输出不符。只要整体文件名结构不变,上述代码可自动适配不同站点名、PR编号、code长度的场景,无需额外修改。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

