#matlab #file #renaming
#matlab #файл #переименование
Вопрос:
Если в папке есть следующие файлы C:test:
файл1.TIF, file2.TIF …. file100.TIF
Может ли MatLab автоматически переименовывать их в:
file_0001.TIF, file_0002.TIF, …. file_0100.TIF?
Комментарии:
1. Я думаю, если вы загрузите их в цикл for и сохраните их с новым именем, вы могли бы это сделать. Я не знаю, есть ли способ сделать это, не открывая и не закрывая их
2. Посмотрите
movefile
. Интересно, может ли быть подход с использованием массива ячеек без цикла или, может быть, сcellfun
, который, я сомневаюсь, привел бы к улучшению производительности, возможно, самое большее, к элегантности.3. Спасибо #Ander Biguri и #Divakar
Ответ №1:
Подход без цикла —
directory = 'C:test'; %//' Directory where TIFF images are present
filePattern = fullfile(directory, 'file*.tif'); %//' files pattern with absolute paths
old_filename = cellstr(ls(filePattern)) %// Get the filenames
file_ID = strrep(strrep(old_filename,'file',''),'.TIF','') %// Get numbers associated with each file
str_zeros = arrayfun(@(t) repmat('0',1,t), 5-cellfun(@numel,file_ID),'uni',0) %// Get zeros string to be pre-appended to each filename
new_filename = strcat('file_',str_zeros,file_ID,'.TIF') %// Generate new filenames
cellfun(@(m1,m2) movefile(m1,m2),fullfile(directory,old_filename),fullfile(directory,new_filename)) %// Finally rename files with the absolute paths
Редактировать 1:
Для случая, когда у вас есть имена файлов как file27.TIF
, file28.TIF
, file29.TIF
и так далее, и вы хотели бы переименовать их как file0001.TIF
, file0002.TIF
, file0003.TIF
и так далее соответственно, попробуйте это —
directory = 'C:test'; %//' Directory where TIFF images are present
filePattern = fullfile(directory, 'file*.tif'); %//' files pattern with absolute paths
old_filename = cellstr(ls(filePattern)) %// Get the filenames
file_ID = strrep(strrep(old_filename,'file',''),'.TIF','') %// Get numbers associated with each file
file_ID_doublearr = str2double(file_ID)
file_ID_doublearr = file_ID_doublearr - min(file_ID_doublearr) 1
file_ID = strtrim(cellstr(num2str(file_ID_doublearr)))
str_zeros = arrayfun(@(t) repmat('0',1,t), 4-cellfun(@numel,file_ID),'uni',0) %// Get zeros string to be pre-appended to each filename
new_filename = strcat('file',str_zeros,file_ID,'.TIF') %// Generate new filenames
cellfun(@(m1,m2) movefile(m1,m2),fullfile(directory,old_filename),fullfile(directory,new_filename)) %// Finally rename files with the absolute paths
Комментарии:
1. Я знал, что должен быть способ сделать это без цикла.
2. @excaza Да, я думаю,
arrayfun
иcellfun
только привнесите «элегантность» в таблицу, я сомневаюсь, что будет улучшение производительности.3. Большое вам спасибо. Как насчет того, есть ли у меня в папке следующие файлы: file27. TIF, файл28. TIF, file29.TIF. Могу ли я переименовать их, начиная с 0001, т. Е. переименовать их в: file0001.TIF, file0002.TIF, file0003.TIF
4. @Mosawi Да, я так думаю. После того, как у вас есть
file_ID
, сделайте это —file_ID = file_ID - 26
,str_zeros = arrayfun(@(t) repmat('0',1,t), 4-cellfun(@numel,file_ID),'uni',0)
и, наконецnew_filename = strcat('file',str_zeros,file_ID,'.TIF')
5. Для (file_ID — 6) я получаю ошибку «Неопределенная функция ‘минус’ для входных аргументов типа ‘ячейка'». Есть идеи, как это исправить?
Ответ №2:
Немного более надежный метод:
dirlist = dir(fullfile(mypath,'*.TIF'));
fullnames = {dirlist.name}; % Get rid of one layer of cell array-ness
[~,fnames,~] = cellfun(@fileparts,fullnames,'UniformOutput',false); % Create cell array of the file names from the output of dir()
fnums = cellfun(@str2double,regexprep(fnames,'[^0-9]','')); % Delete any character that isn't a number, returns it as a vector of doubles
fnames = regexprep(fnames,'[0-9]',''); % Delete any character that is a number
for ii = 1:length(dirlist)
newname = sprintf('%s_d.TIF',fnames{ii},fnums(ii)); % Create new file name
oldfile = fullfile(mypath,dirlist(ii).name); % Generate full path to old file
newfile = fullfile(mypath,newname); % Generate full path to new file
movefile(oldfile, newfile); % Rename the files
end
Хотя это позволит разместить имена файлов любой длины, предполагается, что в имени файла нет чисел, кроме счетчика в конце. MATLAB любит помещать объекты во вложенные массивы ячеек, поэтому я включил cellfun
в пару мест, чтобы привести объекты к более управляемым форматам. Это также позволяет нам векторизовать часть кода.