Sorting files inside a folder

11 visualizaciones (últimos 30 días)
shivasakthi
shivasakthi el 17 de En. de 2017
Comentada: shivasakthi el 25 de En. de 2017
I have files named
1 1a.bmp
1 1b.bmp
1 2a.bmp
1 2b.bmp
...
2 1a.bmp
2 1b.bmp
2 2a.bmp
2 2b.bmp
....
23 1a.bmp
23 1b. bmp
and so on
in a single folder. I have to sort these files in the order
1 1a.bmp
1 1b.bmp
2 1a.bmp
2 1b.bmp
3 1a.bmp
3 1b.bmp
...
23 1a.bmp
23 1b.bmp
1 2a.bmp
1 2b.bmp
....
23 2a.bmp
23 2b.bmp
and so on. Kindly help me with the syntax for this in Matlab.
  1 comentario
Stephen23
Stephen23 el 17 de En. de 2017
Editada: Stephen23 el 17 de En. de 2017
The best solution would be to name the files so that the names could be sorted by any standard sort algorithm. That would mean placing the most significant field first, and the least significant last, and using leading zeros.
Why is this a better solution? Because fixing the problem is always better than writing hack code to try and "fix" it later.
You might like to experiment with my FEX submission:

Iniciar sesión para comentar.

Respuesta aceptada

Stephen23
Stephen23 el 17 de En. de 2017
Editada: Stephen23 el 19 de En. de 2017
This code gives the order requested in the original question:
C = {...
'1 1a.bmp';...
'1 1b.bmp';...
'1 2a.bmp';...
'1 2b.bmp';...
'2 1a.bmp';...
'2 1b.bmp';...
'2 2a.bmp';...
'2 2b.bmp';...
'23 1a.bmp';...
'23 1b.bmp';...
};
%
fun = @(s)sscanf(s,'%u%u%c.bmp').';
D = cellfun(fun,C,'UniformOutput',false);
[~,idx] = sortrows(cell2mat(D),[2,1,3]);
out = C(idx)
generating this:
out =
'1 1a.bmp'
'1 1b.bmp'
'2 1a.bmp'
'2 1b.bmp'
'23 1a.bmp'
'23 1b.bmp'
'1 2a.bmp'
'1 2b.bmp'
'2 2a.bmp'
'2 2b.bmp'
  13 comentarios
Stephen23
Stephen23 el 19 de En. de 2017
Editada: Stephen23 el 19 de En. de 2017
Run all of my code, and then this:
N = 100;
Z = cell(1,N);
for k = 1:N
str = fullfile(sub,out{k});
Z{k} = imread(str);
end
"assign it to a different variable?" bad idea. Read this:
shivasakthi
shivasakthi el 25 de En. de 2017
Hi Stephen,
That was great. I have also sorted my files in the windows folder using special sorting techniques suggested by the windows community. By the way, I am proposing to apply translation, at varying levels, to a set of 100 images in a folder named "chrom" in D:\. After applying the translations, I want these images to be stored in a different folder say "chrom-translate1" in the same D:\. In this way, I need to apply translations of different degrees, and store it in different folders in D:\. Kindly help me with the code for this. Thanks in advance.

Iniciar sesión para comentar.

Más respuestas (2)

Image Analyst
Image Analyst el 17 de En. de 2017
  1 comentario
Stephen23
Stephen23 el 17 de En. de 2017
@Image Analyst: it is not quite a natural order sort, because the fields (characters or numbers) are not parsed from from left to right.

Iniciar sesión para comentar.


Andrei Bobrov
Andrei Bobrov el 18 de En. de 2017
My small contribution
x = regexp(C,'(\d+) (\d+)([ab])','tokens','once');
y = cat(2,x{:});
[~,ii] = sortrows([str2double(y(1:2,:));cellfun(@(x)x-'0',y(end,:))]',[2 1 3]);
out = C(ii)
  1 comentario
shivasakthi
shivasakthi el 18 de En. de 2017
Editada: Image Analyst el 18 de En. de 2017
Hi Andrei,
FYI, Chrom1 is a folder that contains 5036 files of the form 1 1a.bmp, 1 1b.bmp, ....,23 1a.bmp, 23 1b.bmp,...,23 4a.bmp, 23 4b.bmp and so on, as posed in my question before.
I ran the following code along with your suggested code and got the error:
>> S = dir('Q:\chrom1*.bmp');
>> C = {S.name}';
>> x = regexp(C,'(\d+) (\d+)([ab])','tokens','once');
>> [~,ii] = sortrows([str2double(y(1:2,:));cellfun(@(x)x-'0',y(end,:))]',[2 1 3]);
Error: Index exceeds matrix dimensions.
Can you help getting it sorted? Thanks for your assistance.

Iniciar sesión para comentar.

Categorías

Más información sobre Shifting and Sorting Matrices en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by