在文件名列表中获取最大值

时间:2019-09-11 20:43:08

标签: r regex string max

我有一个带有通用标题的文件名列表

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]*$

5 个答案:

答案 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)

另一种方法是在文件夹中保留一个特殊的文本文件,该文件仅包含最近使用的数字。然后,每次将新文件添加到文件夹时,读取并增加编号。这是获取使用最大值的一种更快的方法,尤其是在文件夹中有成千上万个文件的情况下。这也是一个不太复杂的解决方案。