从目录向量提取Basler_后至_bg/_frames前的唯一名称
提取目录路径中的唯一名称
问题背景
现有如下目录路径向量:
c("", "Dia 04", "Dia 04/Basler_2020-11-04 13_08_41.568967_bg", "Dia 04/Basler_2020-11-04 13_08_41.568967_frames", "Dia 04/Basler_2020-11-04 13_38_46.380957_bg", "Dia 04/Basler_2020-11-04 13_38_46.380957_frames", "Dia 04/Basler_2020-11-04 14_08_51.133352_bg", "Dia 04/Basler_2020-11-04 14_08_51.133352_frames", "Dia 04/Basler_2020-11-04 14_38_55.875411_bg", "Dia 04/Basler_2020-11-04 14_38_55.875411_frames")
需要提取Basler_之后、_bg或_frames之前的唯一名称,尝试用list.dirs()的pattern参数未生效。
解决方案
方法1:直接处理已有目录向量
如果已经获取了目录向量,可按以下步骤提取目标内容:
- 过滤出包含
Basler_且以_bg/_frames结尾的路径 - 用正则提取中间核心名称
- 去重得到唯一结果
代码示例:
# 定义目录向量 dir_vec <- c("", "Dia 04", "Dia 04/Basler_2020-11-04 13_08_41.568967_bg", "Dia 04/Basler_2020-11-04 13_08_41.568967_frames", "Dia 04/Basler_2020-11-04 13_38_46.380957_bg", "Dia 04/Basler_2020-11-04 13_38_46.380957_frames", "Dia 04/Basler_2020-11-04 14_08_51.133352_bg", "Dia 04/Basler_2020-11-04 14_08_51.133352_frames", "Dia 04/Basler_2020-11-04 14_38_55.875411_bg", "Dia 04/Basler_2020-11-04 14_38_55.875411_frames") # 过滤符合结构的路径 target_paths <- grep("Basler_.*(_bg|_frames)$", dir_vec, value = TRUE) # 提取目标名称部分 extracted <- sub(".*/Basler_(.*)_(bg|frames)$", "\\1", target_paths) # 去重得到唯一名称 unique_names <- unique(extracted) # 输出结果 unique_names
运行后输出:
[1] "2020-11-04 13_08_41.568967" "2020-11-04 13_38_46.380957" [3] "2020-11-04 14_08_51.133352" "2020-11-04 14_38_55.875411"
方法2:调整list.dirs()参数获取路径后提取
原list.dirs()调用未生效的原因是:默认不支持Perl正则的正向预查语法,且pattern仅用于筛选路径而非提取内容。调整后代码如下:
# 从文件系统获取符合条件的目录名 target_dirs <- list.dirs(path = ".", full.names = FALSE, recursive = TRUE, pattern = "Basler_.*(_bg|_frames)$", perl = TRUE) # 提取目标名称并去重 unique_names <- unique(sub("Basler_(.*)_(bg|frames)$", "\\1", target_dirs))
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

