R语言 获取文件名列表中的最大值

gv8xihay  于 2023-05-04  发布在  其他
关注(0)|答案(6)|浏览(146)

我有一个文件名列表,上面有总标题

a_file_name_1
a_file_name_34
a_file_name_452
new_data_2018.csv

我想重命名new_data_2018.csv文件,使其数字结尾比文件夹中预先存在的最大文件大1。
到目前为止

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

r1wp621o

r1wp621o1#

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

r8uurelv2#

使用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
EDIT-如果您现有的文件名中有一致的年份,则可以使用以下方法:

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时,这可能会遇到问题。

li9yvcax

li9yvcax3#

OP [0-9]*$提出的正则表达式指向正确的方向,因为它将在字符串的最后选择零个或多个数字。* 关键部分 * 是$,它指定 * 一行末尾的匹配 。(有趣的是,$在迄今为止发布的所有其他答案中都被从正则表达式中省略了)。
为了安全起见,我建议使用[0-9]+$,它在字符串的最后选择一个或多个数字。
没有必要 * 重命名像new_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", .)
ulmd4ohb

ulmd4ohb4#

// Specify the folder path
        string folderPath = @"C:\NumberedFiles";

        // Get the filenames in the folder
        string[] filenames = Directory.GetFiles(folderPath);

        // Create a list to store the Numbers
        List<int> NumberList = new List<int>();

        foreach (string filename in filenames)
        {
            //Extract the number from the filename.
            //Assuming the number is between the last underscore character and the last dot before the file extension
            //(eg. a_file_name_34.txt)

            //Get index of the last underscore charater
            int IndexOfLastUnderscore = filename.LastIndexOf("_");

            //Get Length of characters between the underscore character and the dot character
            int LengthOfNumber = filename.LastIndexOf(".") - filename.LastIndexOf("_") - 1;

            //Extract the number and convert to an integer.
            //Add one to starting index of the substring.
            int number = Convert.ToInt32(filename.Substring(IndexOfLastUnderscore + 1, LengthOfNumber));

            NumberList.Add(number);
        }

        // Get the maximum number
        int MaxNumber = NumberList.Max();
zy1mlcev

zy1mlcev5#

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

a_file_name_00452
a_file_name_00034
a_file_name_00001

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

os8fio9y

os8fio9y6#

另一种方法是在文件夹中保存一个特殊的文本文件,该文件夹仅保存最后使用的数字。然后每次向文件夹中添加新文件时读取并递增编号。这是获得最大使用值的更快方法,特别是如果文件夹中有数千个文件。这也是一个不那么复杂的解决方案。

相关问题