首页 > 解决方案 > 使用可变数量的#s 解析文件名

问题描述

这是我被困住的问题之一——而且很沮丧,因为必须有另一种方法:

我想要实现的是在 R 中解析很多路径/文件名。名称是这样的:

name1 <- "alpha234#181225235959/alpha234#181225235959_pic_4_1-8_9_19_90.dat"
name2 <- "alpha123#181225235959#Tag/alpha123#181225235959#Tag_pic_4_1-8_9_19_90.dat"

我想要的是剥离第一个之前的位,/并有一个字符串对应于之后的内容/,直到第一个#,另一个对应于第一个之后的内容,#包括任何后续#的 s。

这是我在第一步中所做的(直到/):

splitname1 <- strsplit(name1, "/")
splitname1
[[1]]
[1] "alpha234#181225235959"        "alpha234#181225235959_pic_4_1-8_9_19_90.dat"

同样对于name2

splitname2 <- strsplit(name2, "/")
splitname2
[[1]]
[1] "alpha123#181225235959#Tag"    "alpha123#181225235959#Tag_pic_4_1-8_9_19_90.dat"

问题来了。我strsplit用来处理上述步骤中的“尾巴”:

strsplit(splitname1[[1]][2], "#")
[[1]]
[1] "alpha234"                           "181225235959_pic_4_1-8_9_19_90.dat"

strsplit(splitname2[[1]][2], "#")
[[1]]
[1] "alpha123"                  "181225235959"              "Tag_pic_4_1-8_9_19_90.dat"

然后我得到两个字符串或一个。没有多少paste和我考虑过的其他东西能够以一种可以处理这两种情况(无论是否需要)的方式将这两个字符串合并成。

一定会有更好的办法。

标签: r

解决方案


我不是 100% 确定你希望你的输出是什么样的,但我认为paste选项collapse = '#'应该会有所帮助:

name1 <- "alpha234#181225235959/alpha234#181225235959_pic_4_1-8_9_19_90.dat"
name2 <- "alpha123#181225235959#Tag/alpha123#181225235959#Tag_pic_4_1-8_9_19_90.dat"

name_list <- list(name1, name2)

lapply(name_list, function(x) {
  tmp <- strsplit(strsplit(x, "/")[[1]][2], "#")[[1]]
  c(tmp[1], paste(tmp[-1], collapse = "#"))
})
# [[1]]
# [1] "alpha234"                           "181225235959_pic_4_1-8_9_19_90.dat"
# 
# [[2]]
# [1] "alpha123"                               "181225235959#Tag_pic_4_1-8_9_19_90.dat"

推荐阅读