我有一个带有通用标题的文件名列表
a_file_name_1
a_file_name_34
a_file_name_452
new_data_2018.csv
我想重命名new_data_2018.csv
文件,以使其数字结尾比文件夹中最大的现有文件大一个。
到目前为止我有
#list files in directory
list_files_names <- list.files(directory_2018)
#capture largest suffix
largest_value <-
new_largest_value <- largest_value + 1
# rename file
file.rename("new_data_2018.csv", paste0('a_file_name_', new_largest_value)
我的问题是我如何才能以返回最大后缀的方式收集现有文件名。我想这可能与正则表达式有关,下面的正则表达式可能对它们有用[0-9]*$
。
答案 0 :(得分:2)
您可以解析数字,选择最大的数字,然后添加+1:
files <- c("a_file_name_1",
"a_file_name_34",
"a_file_name_452")
largest_value <- as.numeric(gsub("\\D", "", files))
new_largest_value <- max(largest_value) + 1
如果文件中还有其他数字,则可以使用一些正则表达式或仅在下划线上将其拆分,然后将最后一个元素转换为数字:
files <- c("a_file_name_2019_1",
"a_file_name_2019_34",
"a_file_name_2019_452")
largest_value <- as.numeric(gsub("\\D", "", sapply(strsplit(files, "_", fixed = TRUE), tail, 1)))
new_largest_value <- max(largest_value) + 1
或使用正则表达式:
largest_value <- as.numeric(sub(".*\\_", "", files))
new_largest_value <- max(largest_value) + 1
答案 1 :(得分:2)
使用tidyr:
list_file_names <- list.files(directory_2018)
new_largest_value <- max(extract_numeric(list_file_names))+1
注意:这取决于文件名中是否没有不需要的数字。示例:
extract_numeric('file_2A3B4_name_222.csv')
将返回:234222
编辑-如果现有文件名中的年份保持一致,则可以进行以下操作:
list_file_names <- list.files(directory_2018)
file_name_numbers <- extract_numeric(list_file_names)
values_no_year <- as.numeric(gsub(pattern = '2018', replacement='', x = file_name_numbers))
new_largest_value <- max(values_no_year)+1
注意:当文件号包含2018时,这可能会出现问题。
答案 2 :(得分:0)
OP [0-9]*$
提出的正则表达式指向正确的方向,因为它将在字符串的最后选择零个或多个数字。 关键部分是$
,用于指定行尾的匹配项。 (有趣的是,到目前为止发布的所有其他答案中,正则表达式都省略了$
)。
为了安全起见,我建议使用[0-9]+$
,它会在字符串的末尾选择一个或多个数字。像new_data_2018.csv
这样的不需要 to rename files,它们之间包含一个数字,但不是最后一个数字。
因此,使用
filenames <- c("a_file_name_1", "a_file_name_34", "a_file_name_452", "a_file_name_2019_31", "new_data_2018.csv")
代码
library(magrittr) # piping used to improve readability
largest_value <- filenames %>%
stringr::str_extract("\\d+$") %>% # pick numbers at the very end of filenames
as.integer() %>%
max(na.rm = TRUE)
计算
largest_value
[1] 452
可用于构造新文件名。
整个过程可以写成管道:
library(magrittr) # piping used to improve readability
filenames %>%
stringr::str_extract("[0-9]+$") %>% # pick numbers at the very end of filenames
as.integer() %>%
max(na.rm = TRUE) %>%
add(1) %>%
paste0("a_file_name_", .) %>% # create new file name
file.rename("new_data_2018.csv", .)
答案 3 :(得分:-1)
在文件名的数字中添加零,然后按文件名降序排列。
a_file_name_00452
a_file_name_00034
a_file_name_00001
头文件名将包含最大值。
答案 4 :(得分:-1)
另一种方法是在文件夹中保留一个特殊的文本文件,该文件仅包含最近使用的数字。然后,每次将新文件添加到文件夹时,读取并增加编号。这是获取使用最大值的一种更快的方法,尤其是在文件夹中有成千上万个文件的情况下。这也是一个不太复杂的解决方案。