2014-11-26 4 views
1

У меня есть несколько текстовых файлов без каких-либо последовательно:Matlab: переименование файлов в последовательном порядке

010010.txt 010030.txt 010070.txt 

Как я могу изменить имена файлов на:

text01.txt text02.txt .... 

Можно не чтобы перезаписать старый каталог, но создать новый каталог

Я использовал следующий скрипт, но в результате он работает нормально, но он идет от text001.txt до text021.txt. затем text041.txt

любая идея?

directory = 'C:\test\'; %//' Directory with txt files 
filePattern = fullfile(directory, '*.txt'); %//' files pattern with absolute paths 
old_filename = cellstr(ls(filePattern)) %// Get the filenames 
file_ID = strrep(strrep(old_filename,'file',''),'.txt','') %// 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,'.txt') %// Generate new filenames 

cellfun(@(m1,m2) movefile(m1,m2),fullfile(directory,old_filename),fullfile(directory,new_filename)) %// Finally rename files with the absolute paths 
+2

Это можно сделать, но не ожидайте, что мы сделаем для вас всю работу. Покажите свои попытки и задайте конкретные вопросы о том, где вы застряли –

+1

Итак, я просто добавил скрипт, который я использовал, но он перескакивает с text001.txt в text021.txt и не знает почему. – Tomas

ответ

0

Это выглядит довольно сложно. Я бы просто сделал системный вызов, чтобы переместить все файлы в новый каталог, а затем последовательно переименовывать каждый файл по одному с дополнительными системными вызовами. Также похоже, что вы используете Windows, поэтому я предоставил решение для этой платформы. У вас есть начало прямо там, где вы читаете файлы из исходного каталога.

directory = 'C:\test\'; %// Directory with txt files 
directoryToCopyOver = 'C:\out\'; %// Directory where you want to copy the files over 

%// Copy source directory to target directory 
system(['xcopy ' directory ' ' directoryToCopyOver]); 

filePattern = fullfile(directoryToCopyOver, '*.txt'); %//' files pattern with absolute paths 
names = dir(filePattern); %// Find all files with above pattern 

%// For each file we have... 
for idx = 1 : numel(names) 
    name = names(idx).name; %// Get a name of a file 
    %// Rename this file to textxx.txt 
    outName = sprintf('text%2.2d.txt', idx); 

    %// Call system and rename the file 
    system(['ren ' directoryToCopyOver name ' ' directoryToCopyOver outName]); 
end 

Некоторые важные вещи, чтобы отметить, что я использую system сделать системные вызовы в командную строку Windows. Я использую xcopy, чтобы скопировать весь каталог из одной точки в другую. В этом случае это будет ваш исходный каталог для нового целевого каталога. После этого я вызываю MATLAB dir, чтобы определить все имена файлов, которые соответствуют определенному шаблону, который вы выложили, и это все текстовые файлы.

Затем для каждого имени текстового файла мы читаем это имя, а затем создаем выходное имя типа textxx.txt, где xx - это номер, начинающийся с 1 на столько текстовых файлов, что и у нас, а затем я вызываю команду командной строки Windows ren переименовать файл с исходного имени на новое имя. Также обратите внимание на sprintf от MATLAB. Он предназначен для создания строк с использованием разделителей форматирования. Если вы видите, как я его назвал, %2.2d означает, что я ожидаю, что число будет двухзначным числом, и если число будет меньше двух цифр, заполните пробелы нулем. Если вы хотите увеличить количество цифр, просто добавьте больше для каждого места. Например, если вы хотите иметь 4 цифры, сделайте %4.4d и так далее. Это правильно создаст правильную строку, чтобы мы могли переименовать нужный файл в этом новом каталоге.


Надеюсь, это поможет!