文件名排序Matlab程序
由来:手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
1.jpg
10.jpg
100.jpg
101.jpg
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
如果不是上面两种情况的话,本文就是实现从小到大排序。
提示1:文件名的获取
通过dir可以得到目录下的文件名,比如:
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
filename=str2mat(jpgfile.name);
提示2:字符串数组
先试一下:
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
这样就导致上面得到的filename每行的长度都相同。
本文原理:
先判断每行最后面有多少个空格,
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
这样排序就可以实现上述的文件名排序功能。
本文代码:
function varargout=LengthSortStr(str)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Argment: str文件名组成的字符串数组
% : 输出参数同sort函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
=size(str); %个数以及每行的长度
newname=[''];
for i=1:N
BlackSpace=0;
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
BlackSpace=BlackSpace+1;
end
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
newstr(i,:)=;
end
=sortrows(newstr); %新字符排序,主要要得到排序的序号
sortstr=str(order,:); %由这个序号生成原始的排序名
if nargout<=1
varargout{1}=sortstr;
elseif nargout==2
varargout{1}=sortstr;
varargout{2}=order;
end
复制代码
实例:
%对D盘下面的bmp图的文件名进行排序
clear
dirpath='d:\'; %路径
extname='bmp'; %扩展名
if dirpath(end)~='\' %如果路径后面没有加\,添加
dirpath=;
end
%先取出目录下的文件信息
pic=dir();
filename=str2mat(pic.name); %取得文件名
%调用函数
sortfile=LengthSortStr(filename)
复制代码
谢谢楼主分享
thank you.!!!
页:
[1]