Переименовать файлы в папке с помощью Matlab - PullRequest
1 голос
/ 21 апреля 2020

Это вопрос, состоящий из двух частей.

  1. У меня есть несколько файлов pdf с такими именами, как:

    First_2000_ Это первый файл.pdf

    Second_2010_ second file.pdf

    Thd_1987_Third file.pdf

    Существует огромное количество файлов с таким форматом имен (alphabets_year_ [иногда может быть место или его не будет) ] довольно длинный заголовок с пробелами .pdf). Теперь я хочу переименовать все таким образом, чтобы между годом и названием не было пробела (например, First_2000_Это первый файл.pdf; Second_2010_second file.pdf). Я написал код с подсказкой https://in.mathworks.com/matlabcentral/answers/338822-rename-files-using-matlab. Но код, который я написал, очищает все пространство между ними:

clear; clc;
folder_name = 'C:\Users\SREERAJ\Desktop\New folder';
dir_infrmatn = dir( fullfile(folder_name, '*.pdf') );
prvs_name = {dir_infrmatn.name};
reduntant = cellfun(@isempty, regexp(prvs_name, '^[A-Z][^_].*') );
prvs_name(reduntant) = [];
regexprep(prvs_name, '\s', '$0')
   for k = 1 : length(prvs_name)
      movefile( fullfile(folder_name, prvs_name{k}), fullfile(folder_name, newnames{k}) );
   end

Второй набор файлов имеет формат

2018-04-19 Это первый файл .pdf

19190829Second file.pdf

Этот набор файлы должны быть преобразованы в формат «20180419Это первый файл.pdf», то есть «yearmonthdayName.pdf» (имя может содержать пробелы между, например, 20180419Это первый файл.pdf).

Как выполнить sh обе эти задачи?

1 Ответ

2 голосов
/ 21 апреля 2020

Это скорее проблема регулярных выражений, чем проблема MATLAB. Вот рабочий пример для обеих ваших задач:

filenames1 = {
    'First_2000_ This is the first file.pdf'
    'Second_2010_ second file.pdf'
    'Thd_1987_Third file.pdf'
};

fun1 = @(x) regexprep(x, '^(.+\d{4})_ (.+)$', '$1_$2');
newfilenames1 = cellfun(fun1, filenames1, 'UniformOutput', false);

filenames2 = {
    '2018-04-19 This is the first file.pdf'
    '19190829Second file.pdf'
};

fun2 = @(x) regexprep(x, '^(\d{4})-(\d{2})-(\d{2}) (.+)$', '$1$2$3$4');
newfilenames2 = cellfun(fun2, filenames2, 'UniformOutput', false);

Вывод:

newfilenames1 =

  3×1 cell array

    {'First_2000_This is the first file.pdf'}
    {'Second_2010_second file.pdf'          }
    {'Thd_1987_Third file.pdf'              }

newfilenames2 =

  2×1 cell array

    {'20180419This is the first file.pdf'}
    {'19190829Second file.pdf'           }

Если вам нужно сделать это много, вы можете действительно углубиться в регулярные выражения и понять эти странные выражения.

PS Поскольку в этих заданиях по переименованию вообще не используются числовые вычисления, вы можете рассмотреть возможность использования языка сценариев общего назначения (например, Python), если вы не ограничены MATLAB. По моему личному опыту, Python предлагает более простые и мощные операции с строками, и я вижу гораздо лучшую производительность при переименовании большого количества файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...