How do I sort filenames containing text and numbers in numerical order in MATLAB?
    74 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
I have a series of .png files in a folder whose names are the following;
(A)Test_Nom_BAUD1.png
(A)Test_Nom_BAUD7.png
(A)Test_Nom_BAUD8.png
(A)Test_Nom_BAUD10.png
(A)Test_Nom_BAUD11.png
In reading the MATLAB documentation, I understand the dir function sorts strings in ASCII dictionary order. And since the files I'm using have no leading zeros, this is a problem. This is exactly what I'm seeing when I use the dir function:
A = dir('*.png');
(A)Test_Nom_BAUD1.png
(A)Test_Nom_BAUD10.png
(A)Test_Nom_BAUD11png
(A)Test_Nom_BAUD7.png
(A)Test_Nom_BAUD8.png
But what I need is this;
A = dir('*.png');
    (A)Test_Nom_BAUD1.png
    (A)Test_Nom_BAUD7.png
    (A)Test_Nom_BAUD8.png
    (A)Test_Nom_BAUD10.png
    (A)Test_Nom_BAUD11.png
I know this can be done if the filenames contain only numbers.
But is it possible to sort these filenames (in numerical order) using existing text manipulation and sorting routines in MATLAB? If so, how?
1 Commento
Risposta accettata
  Cedric
      
      
 il 10 Ott 2017
        
      Modificato: Cedric
      
      
 il 10 Ott 2017
  
      If, for any reason, you cannot install this function, you can sort your filenames as follows:
 [~, reindex] = sort( str2double( regexp( {A.name}, '\d+', 'match', 'once' )))
 A = A(reindex) ;
Note that it assumes that all files have the same base name. If you have to deal with various base names, then you need the function mentioned in the other answers, or to work a little more on the sorting.
5 Commenti
  Image Analyst
      
      
 il 23 Mar 2018
				You'll have to write a custom parsing routine to extract out the numbers you want into numerical vectors then sort them yourself. Shouldn't be hard but let us know if you can't figure it out.
  Stephen23
      
      
 il 21 Set 2018
				
      Modificato: Stephen23
      
      
 il 18 Apr 2021
  
			"You'll have to write a custom parsing routine to extract out the numbers you want into numerical vectors then sort them yourself."
You don't have to do that at all: natsortfiles handles multiple number values already. Just provide an appropriate regular expression, and it will work just fine:
>> C = {...
    'RSN1112-KOBE-1.1_Node_Floor_Dsp.out',...
    'RSN1111-KOBE-0.2_Node_Floor_Dsp.out',...
    'RSN1112-KOBE-0.2_Node_Floor_Dsp.out',...
    'RSN1111-KOBE-0.1_Node_Floor_Dsp.out',...
    'RSN1111-KOBE-1.1_Node_Floor_Dsp.out',...
    'RSN1112-KOBE-0.1_Node_Floor_Dsp.out'};
>> natsortfiles(C,'\d+\.?\d*') % alphanumeric sort
ans =
    'RSN1111-KOBE-0.1_Node_Floor_Dsp.out'
    'RSN1111-KOBE-0.2_Node_Floor_Dsp.out'
    'RSN1111-KOBE-1.1_Node_Floor_Dsp.out'
    'RSN1112-KOBE-0.1_Node_Floor_Dsp.out'
    'RSN1112-KOBE-0.2_Node_Floor_Dsp.out'
    'RSN1112-KOBE-1.1_Node_Floor_Dsp.out'
Più risposte (2)
  KSSV
      
      
 il 10 Ott 2017
        2 Commenti
  Jan
      
      
 il 10 Ott 2017
				Really? But it is on the same server as the forum. Perhaps it works if you insert your country code:
https://mathworks.com/matlabcentral/fileexchange/10959-sort-nat--natural-order-sort (For the US site, or "https://de." for Germany etc.
Vedere anche
Categorie
				Scopri di più su Shifting and Sorting Matrices in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!






