Editor's Note: This file was selected as MATLAB Central Pick of the Week
To sort all of the strings in a cell array use NATSORT:
http://www.mathworks.com/matlabcentral/fileexchange/34464-customizable-natural-order-sort
To sort the rows of a cell array of strings use NATSORTROWS:
http://www.mathworks.com/matlabcentral/fileexchange/47433-natural-order-row-sort
### Summary ###
Alphanumeric sort of a cell array of strings (1xN char). Sorts the strings taking into account the values of any number substrings occurring within those strings. Compare for example:
>> A = {'a2.txt', 'a10.txt', 'a1.txt'};
>> sort(A)
ans = 'a1.txt' 'a10.txt' 'a2.txt'
>> natsortfiles(A)
ans = 'a1.txt' 'a2.txt' 'a10.txt'
By default NATSORTFILES interprets all consecutive digits as integer numbers, the number substring recognition can be specified using a regular expression: see NATSORT for details.
NATSORTFILES does not perform a naive natural-order sort, but sorts the filenames and file extensions separately to ensure a dictionary sort, where shorter filenames always sort before longer ones. Likewise filepaths are split at each file-separator character, and each level of the file hierarchy is sorted separately.
### Example with DIR and Cell Array ###
D = 'C:\Test';
S = dir(fullfile(D,'*.txt'));
N = natsortfiles({S.name});
for k = 1:numel(N)
fullfile(D,N{k})
end
### File Dependency ###
The natural-order sort is provided by the function NATSORT (File Exchange 34464). All of NATSORT's optional inputs are supported by NATSORTFILES.
### Examples ###
>> B = {'test_new.m'; 'test-old.m'; 'test.m'};
>> sort(B) % Note '-' sorts before '.':
ans =
'test-old.m'
'test.m'
'test_new.m'
>> natsortfiles(B) % Shorter names before longer (dictionary sort):
ans =
'test.m'
'test-old.m'
'test_new.m'
>> C = {'test2.m'; 'test10-old.m'; 'test.m'; 'test10.m'; 'test1.m'};
>> sort(C) % Wrong numeric order:
ans =
'test.m'
'test1.m'
'test10-old.m'
'test10.m'
'test2.m'
>> natsortfiles(C) % Shorter names before longer:
ans =
'test.m'
'test1.m'
'test2.m'
'test10.m'
'test10-old.m'
%% Directory Names:
>> D = {'A2-old\test.m';'A10\test.m';'A2\test.m';'A1archive.zip';'A1\test.m'};
>> sort(D) % Wrong numeric order, and '-' sorts before '\':
ans =
'A10\test.m'
'A1\test.m'
'A1archive.zip'
'A2-old\test.m'
'A2\test.m'
>> natsortfiles(D) % Shorter names before longer (dictionary sort):
ans =
'A1archive.zip'
'A1\test.m'
'A2\test.m'
'A2-old\test.m'
'A10\test.m'
Stephen Cobeldick (2019). Natural-Order Filename Sort (https://www.mathworks.com/matlabcentral/fileexchange/47434-natural-order-filename-sort), MATLAB Central File Exchange. Retrieved .
2.1.0 | * Fix handling of char<num. |
|
2.0.0 | * NATSORT total rewrite: faster and less memory.
|
|
1.6.0.0 | * Add (very useful) debugging output argument. |
|
1.5.0.0 | * Improve blurb and HTML. |
|
1.5.0.0 | * Minor help edit. |
|
1.5.0.0 | * Add HTML documentation. |
|
1.5.0.0 | * Improve input checking.
|
|
1.4.0.0 | * Clearer description of file dependency.
|
|
1.3.0.0 | * Improve function description.
|
|
1.2.0.0 | - Update documentation only, improve examples. |
|
1.1.0.0 | - Complete acknowledgements. |
Inspired by: asort: a pedestrian alphanumeric string sorter, sort_nat: Natural Order Sort, GetFullPath, Number to Scientific Prefix, Customizable Natural-Order Sort, Number to Words, Natural-Order Row Sort, Words to Number, Scientific Prefix to Number, Next Available Filename
Inspired: Words to Number, Scientific Prefix to Number, Parametric Mapping Scripts for MRI data, Number to Scientific Prefix, Customizable Natural-Order Sort, Number to Words, Natural-Order Row Sort, Interactive Regular Expression Tool, Next Available Filename
Create scripts with code, output, and formatted text in a single executable document.
Stefano Caschera (view profile)
Dhyana Ramamurthy (view profile)
Very helpful. Thanks for the contribution.
Arslan Ahmed Awan (view profile)
Thanks You.
Anu_M (view profile)
Brilliant!
Kiran Ps (view profile)
jing yang (view profile)
very useful function, thanks for your sharing!
Sören Hufschmidt (view profile)
Niravkumar Ambaliya (view profile)
Works perfectly. Awesome work. Thanks.
Luis Ciria (view profile)
Nice!
TekTao (view profile)
TekTao (view profile)
Jurgen vL (view profile)
Yang Ran (view profile)
Thanks so much!
Kevin Ho (view profile)
Wonderfully helpful function. Thank you.
Tatyana P (view profile)
Thanks! Great thing helps a lot!
Canberk Suat Gurel (view profile)
Maria M. (view profile)
Thanks so much, very helpful!
Rahul Kumar Sevakula (view profile)
Thank you. This is excellent. Works as expected.
Paolo (view profile)
Jan (view profile)
This is a powerful, reliable, efficient and well documented tool. The natural sorting of strings or filenames is needed in many situations. Thank you.
Alutsyah Luthfian (view profile)
Very helpful! Thanks...
And also your constant reminder of not using eval, I am very thankful for it also.
Ayu Dyah (view profile)
thanks a lot!
akb akbar (view profile)
Thanks a lot,
really helped me.
hugstone (view profile)
thanks very much!
love me love my dog (view profile)
thanks!
Sanggon Kim (view profile)
Thank you very much.
sid.sapien (view profile)
Thanks, was very handy.
Stephen Cobeldick (view profile)
@Will: it is not so easy "to list files completely like Windows". Windows places non-alphanumeric printing characters first, but their order is not clearly specified: do you know why Windows sorts '~' before '+', and '_' before '=', even though this is not their character code order? I don't. What other special character orders does Windows have? Can you show me where this order is specified?
Then there is the question of _which_ Windows sort order: the file explorer sort order or the powershell sort order? The Win2K sort order, the MS Excel sort order, or the Vista/Win7 sort order? They are all different... and then why just Windows OS, what about other major OS's? Which ones?
Not only is the "Windows sort order" very vaguely defined, this change would actually break NATSORT: I clearly state that NATSORT sorts according to two simple criteria: character code and numeric value. This means NATSORT can provide the same sort as many other "Natural Order Sort" functions written in other languages (do an internet search), which all sort according to the same basic rules as my submission and can provide the same sort order using the very precisely defined character code order. What you are suggesting is to replace the openly-defined and universally-known character code order with a badly-defined proprietary sort order. Interesting...
But it is certainly _possible_ to write a function that does this: show me a reference that defines the "Windows sort order" and then I can help you.
Will (view profile)
This was really useful, however I've just found that where Windows will list files with "_" higher than those with numbers, natsort and natsortfiles will list "_" after numbers and letters.
E.g. Windows lists:
_File
1. File 1
2. File 2
a File
B File
And in MATLAB:
>> natsort({'1. File 1';'2. File 2';'a File';'B File';'_File'})
ans =
'1. File 1'
'2. File '
'a File'
'B File'
'_File'
Could you please implement this in an update? Or advise how to customise the functions to list files completely like Windows?
Ulysses C (view profile)
Changjie Guan (view profile)
It's really useful! Thx.
Moses (view profile)
Wow, my hats off to you sir. Great function and documentation. Many Thanks!
Moses (view profile)
sada shiva (view profile)
Stelios (view profile)
Thanks, that's exactly what I was looking for to sort namefiles formatted as
1-d...,2-d...,...18-d...etc.