这是一个由两部分组成的问题。
-
我有一堆pdf文件,名称如下:
First_2000_这是第一个文件.pdf
Second_2010_第二个文件.pdf
Thd_1987_Third file.pdf
有很多文件的名称格式是这样的(alphabets_year_[有时会有空格或不会有空格]相当长的标题加空格.pdf(。现在我想以一种年份和标题之间没有空格的方式重命名所有文件(例如First_2000_this is the First file.pdf;Second_2010_Second file.pdf(。我从中获得线索编写了代码https://in.mathworks.com/matlabcentral/answers/338822-rename-files-using-matlab.但我写的代码清除了它们之间的所有空间:
clear; clc;
folder_name = 'C:UsersSREERAJDesktopNew 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
19190829第二份文件.pdf
这组文件必须转换为"20180419这是第一个文件.pdf"的格式,即。"yearmonthdayName.pdf"(名称之间可以有空格,例如20180419这是第一个文件.pdf(。
如何完成这两项任务?
这更像是一个正则表达式问题,而不是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' }
如果您需要经常这样做,您可能需要深入研究regex并理解这些奇怪的表达式。
附言:由于这些重命名作业根本不使用任何数值计算,除非您仅限于MATLAB,否则您可能会考虑使用通用脚本语言(如Python(。根据我的个人经验,Python提供了更简单、更强大的字符串操作,并且在重命名大量文件时,我看到了更好的性能。