建不了的模。 发表于 2015-1-20 13:56

文件名排序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)
复制代码


冻鱼 发表于 2015-1-23 12:56

谢谢楼主分享

15733266829 发表于 2015-2-5 14:57

thank you.!!!
页: [1]
查看完整版本: 文件名排序Matlab程序