R中文件名列表中的矢量模式匹配和矢量替换
vector pattern matching and vector replacement in list of files names in R
我在一个文件夹中有 60 个“.tif”文件。它们的命名如下:a_1, a_2, a_3,...,a_30 b_1, b_2, b_3,...,b_30 等等
我想按日期更改数值。
例如,a_1和b_1将分别重命名为a_2010-01-01和b_2010-01-01,而a_2和b_2将被重命名为a_2010-01-02和b_2010-01-02等
我创建了两个向量:
file_name<-list.files("/path/", pattern="tif", recursive=F)
d<-seq(1, 100, 1)
day <- seq(from=as.Date("2010-01-01"), to= as.Date("2010-01-30"), by='day')
我尝试使用函数 gsub 但我不太明白如何使用它:
gsub(d, day, file_name)
我是 R 的新手
可以通过多种方式完成,这里是一个易于理解的方式:
library(data.table)
file_name<-list.files("/path/", pattern="tif", recursive=F)
day <- seq(from=as.Date("2010-01-01"), to= as.Date("2010-01-30"), by='day')
for(i in 1:30){
oldFiles = file_name[file_name %like% paste0("_",i)]
cat("Handling", oldFiles, "\n")
newFiles = gsub(paste0("_", i), paste0("_", as.character(day[i])), oldFiles)
file.rename(from = file.path("/path", oldFiles),to = file.path("/path", newFiles))
}
请确保您已将“/path”更改为文件目录,并在运行上述代码之前进行备份,因为它是盲写的。
一个选项是使用 strsplit
和 sapply
作为:
# Represents sample files from directory
v <- c('a_1', 'a_2', 'a_3','a_30', 'b_1', 'b_2', 'b_3','b_30')
sapply(strsplit(v, split = "_"), function(x){
sprintf("%s_%s-%02d",x[1],"2010-01", as.numeric(x[2]))
})
#[1] "a_2010-01-01" "a_2010-01-02" "a_2010-01-03" "a_2010-01-30" "b_2010-01-01"
# "b_2010-01-02" "b_2010-01-03" "b_2010-01-30"
这里的关键是您没有将其作为 gsub
问题来处理。你在正确的轨道上,因为我认为你不想使用 gsub
。您已经创建了一个日期向量,现在您只需在其前面添加 "a_"
和 "b"
。 file.rename()
是您要用来重命名文件的名称。在重命名文件的同时尝试模式匹配比它的价值更痛苦。只需创建矢量并重命名:
old_names <- list.files(pattern="tif", recursive=F)
days <- seq(from = as.Date("2010-01-01"), to = as.Date("2010-01-30"), by = "day")
new_names <- paste(paste(rep(c("a", "b"), each = 30), days, sep = "_"), "tif", sep = ".")
file.rename(from = old_names, to = new_names)
我在一个文件夹中有 60 个“.tif”文件。它们的命名如下:a_1, a_2, a_3,...,a_30 b_1, b_2, b_3,...,b_30 等等
我想按日期更改数值。 例如,a_1和b_1将分别重命名为a_2010-01-01和b_2010-01-01,而a_2和b_2将被重命名为a_2010-01-02和b_2010-01-02等
我创建了两个向量:
file_name<-list.files("/path/", pattern="tif", recursive=F)
d<-seq(1, 100, 1)
day <- seq(from=as.Date("2010-01-01"), to= as.Date("2010-01-30"), by='day')
我尝试使用函数 gsub 但我不太明白如何使用它:
gsub(d, day, file_name)
我是 R 的新手
可以通过多种方式完成,这里是一个易于理解的方式:
library(data.table)
file_name<-list.files("/path/", pattern="tif", recursive=F)
day <- seq(from=as.Date("2010-01-01"), to= as.Date("2010-01-30"), by='day')
for(i in 1:30){
oldFiles = file_name[file_name %like% paste0("_",i)]
cat("Handling", oldFiles, "\n")
newFiles = gsub(paste0("_", i), paste0("_", as.character(day[i])), oldFiles)
file.rename(from = file.path("/path", oldFiles),to = file.path("/path", newFiles))
}
请确保您已将“/path”更改为文件目录,并在运行上述代码之前进行备份,因为它是盲写的。
一个选项是使用 strsplit
和 sapply
作为:
# Represents sample files from directory
v <- c('a_1', 'a_2', 'a_3','a_30', 'b_1', 'b_2', 'b_3','b_30')
sapply(strsplit(v, split = "_"), function(x){
sprintf("%s_%s-%02d",x[1],"2010-01", as.numeric(x[2]))
})
#[1] "a_2010-01-01" "a_2010-01-02" "a_2010-01-03" "a_2010-01-30" "b_2010-01-01"
# "b_2010-01-02" "b_2010-01-03" "b_2010-01-30"
这里的关键是您没有将其作为 gsub
问题来处理。你在正确的轨道上,因为我认为你不想使用 gsub
。您已经创建了一个日期向量,现在您只需在其前面添加 "a_"
和 "b"
。 file.rename()
是您要用来重命名文件的名称。在重命名文件的同时尝试模式匹配比它的价值更痛苦。只需创建矢量并重命名:
old_names <- list.files(pattern="tif", recursive=F)
days <- seq(from = as.Date("2010-01-01"), to = as.Date("2010-01-30"), by = "day")
new_names <- paste(paste(rep(c("a", "b"), each = 30), days, sep = "_"), "tif", sep = ".")
file.rename(from = old_names, to = new_names)