r - 使用可变数量的#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
和我考虑过的其他东西能够以一种可以处理这两种情况(无论是否需要)的方式将这两个字符串合并成。
一定会有更好的办法。
解决方案
我不是 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"
推荐阅读
- ios - 在 didSelectItemAt 中选择单元格时取消选择 cellForItemAt 中的单元格
- sql-server - tempdb 在已提交读快照隔离下没有增长
- python - urllib 模块中的请求类不存在
- python - 使用 django 将 PostGis Polygon 转换为传单地图
- git - Magit 不考虑 ~/.gitignore
- docker-compose - 让 docker-compose up 只运行某些容器
- python - 使用 `print()` 写入以二进制模式打开的文件
- python - 读取文件并转换值“'list' 对象没有属性 'find' on”
- assembly - 关于简单浮点加载指令的困惑
- react-native - -bash: react-native: 在 MAC 上找不到命令