【问题标题】:Get maximum value in list of filenames获取文件名列表中的最大值
【发布时间】:2019-09-11 20:43:08
【问题描述】:

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

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

【问题讨论】:

    标签: r regex string max


    【解决方案1】:

    你可以解析数字,选择最大的一个,然后加上+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
    

    【讨论】:

    • 感谢您的回复。如果文件名包含相关数字,是否对模式进行了易于访问的编辑,例如:而不是“a_file_name_1”......它是“a_file_name_2019_1”“a_file_name_2019_31”等?
    • 这是否意味着您只想考虑. 之前的数字?
    • 标题最后一个下划线之后的数字
    • 谢谢!它工作得很好。为了解决这个问题,我不得不重命名new_data_2018.csv 并排除largest_value 中的缺失值。感谢修订!
    【解决方案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 时,这可能会遇到问题。

    【讨论】:

    • tidyr::extract_numeric() 根据文档已弃用。应该改用readr::parse_number()
    【解决方案3】:

    OP [0-9]*$ 提出的正则表达式指向正确的方向,因为它将在字符串的最后选择零个或多个数字。 关键部分$,它指定在行尾匹配。 (有趣的是,$ 在迄今为止发布的所有其他答案中都已从正则表达式中省略)。

    为了安全起见,我建议使用[0-9]+$,它会在字符串的最后选择一个或多个数字。 不需要to rename filesnew_data_2018.csv 一样,它们之间包含一个数字,但不是在最后。

    所以,使用

    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", .)
    

    【讨论】:

      【解决方案4】:

      将零添加到文件名中的数字,然后按文件名降序排序。

      a_file_name_00452
      a_file_name_00034
      a_file_name_00001
      

      顶部文件名将包含最大值。

      【讨论】:

      • 谢谢,我更喜欢我可以存储的文档数量没有上限的东西
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        • 2020-09-22
        • 1970-01-01
        • 1970-01-01
        • 2013-10-25
        • 2016-01-21
        • 2019-10-23
        相关资源
        最近更新 更多