Sorting the name field in dir command

253 views (last 30 days)
Raúl
Raúl on 14 Mar 2013
Edited: Stephen23 on 18 Apr 2021
Hi all,
I have a problem when I'm trying to get the content of a folder. It gets the name of the files but not in order. For example, the files starts with X- where the X is a number from 1 to 320. My code gets the name's file in the order 1, 10, 100, etc... and I need it in order 1,2,3,4...320
This is my code
myFolder = 'C:\Users\U95511\Dropbox\UPF\Roberto Verino\Advantrack\Test15-130313\P12\A3\Results';
if ~isdir(myFolder)
errorMessage = sprintf('Error: The following folder does not exist:\n%s', myFolder);
uiwait(warndlg(errorMessage));
return;
end
filePattern = fullfile(myFolder, '*.xls');
xlsFiles = dir(filePattern);
I need to order the struct xlsFiles.
I tried with W=sort(xlsFiles.name) but it creates an array instead of another struct ordered.
Thanks for the help.
BR,
Raúl.

Answers (4)

Jonathan Sullivan
Jonathan Sullivan on 14 Mar 2013
Edited: Jonathan Sullivan on 14 Mar 2013
[~,ind]=sort({xlsFiles.name});
W = xlsFiles(ind);
  2 Comments
Raúl
Raúl on 14 Mar 2013
Thanks Jonathan,
But it continues unsorted...
Andre Guerra
Andre Guerra on 16 Nov 2016
That did the trick for me! Thanks a bunch!

Sign in to comment.


Azzi Abdelmalek
Azzi Abdelmalek on 14 Mar 2013
f= dir(filePattern);
xlsfiles={f.name}
xlsfiles=sort(xlsfiles)
  2 Comments
Raúl
Raúl on 14 Mar 2013
Thanks Azzi,
It also creates an array instead of a struct.
Azzi Abdelmalek
Azzi Abdelmalek on 14 Mar 2013
Edited: Azzi Abdelmalek on 14 Mar 2013
yourfolder= dir(filePattern);
xlsfiles={yourfolder.name}
[~,idx]=sort(xlsfiles)
new_folder=yourfolder(idx)

Sign in to comment.


Stephen23
Stephen23 on 18 Apr 2021
Edited: Stephen23 on 18 Apr 2021
You could download my FEX submission natsortfiles:
>> S = dir('*.txt');
>> S.name
ans =
'1.txt'
ans =
'10.txt'
ans =
'2.txt'
>> S = natsortfiles(S); % alphanumeric sort by filename
>> S.name
ans =
'1.txt'
ans =
'2.txt'
ans =
'10.txt'

Dan
Dan on 16 Mar 2021
Most of the time you don't need to actually sort the names. You can use the index to control the order in which a loop will access the names. This code works for me on version 2020b.
filePattern = '*.*';
files = dir(filePattern);
[~,idx] = sort(string({files.name}),2,'ascend');
for fileLoop=idx
% do something with files like print the names in order
fprintf('File: %d, %s', fileLoop, files(fileLoop).name)
end

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!