数学建模社区-数学中国

标题: 文件名排序Matlab程序 [打印本页]

作者: 建不了的模。    时间: 2015-1-20 13:56
标题: 文件名排序Matlab程序
由来:
. H, v* i4 y+ T+ G% w( {! V手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是9 u2 v# ~! S2 j! Y* j% ~1 W
1.jpg. [7 G: a  ~3 v
10.jpg& c0 m, |+ K! M% P* y
100.jpg- w( C* q4 D- ]& q$ B! [4 h
101.jpg
- W) B- A- q# d- t就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
) w" K! Y7 v0 p1 r0 N
+ w" o  C0 h: H当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。+ [8 q, n% W5 y/ }. |# g: j
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。5 W$ B7 Q. c# E1 \5 i
如果不是上面两种情况的话,本文就是实现从小到大排序。5 k/ V* M: T* h. e

6 o/ v0 u, V3 s3 V( h
* N( |1 ~# }  M$ u1 C' j) t提示1:文件名的获取
3 N" v; n8 y4 j1 Z/ @% F' o通过dir可以得到目录下的文件名,比如:
3 ^" |9 ]1 V8 c. S% R5 |jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。3 B1 u8 e2 w& B( x* b3 H% [
filename=str2mat(jpgfile.name);  
, \+ o8 b, j5 w; v' s5 q) q  \1 j" g, j$ Q1 J. S  W" c" f
提示2:字符串数组
0 }/ V/ f! r4 b! v1 V' H先试一下:
8 F; ~3 x3 A* z. ]+ p; fstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同+ J) E& a" Z1 g$ U2 E0 ^* E
str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
! p, x. x& @; k; i* Gstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
& r3 I2 H$ P: V( r4 G& t$ V( J7 P3 v7 Q$ V+ t$ l# h+ w5 }! K
这样就导致上面得到的filename每行的长度都相同。1 y& e2 l3 z: n& {
7 @# P5 v& b3 {% I" F) r8 b& `+ c

9 |# @9 q  c" [0 t5 Y) x本文原理:7 o3 O3 B' {# j- R  ^
先判断每行最后面有多少个空格,
0 n/ L9 Y. E5 m& B然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
2 Y9 V4 j& X  f$ Z这样排序就可以实现上述的文件名排序功能。
5 J$ F  j0 A. q1 @* _% _6 ~# y. B1 a- T3 J$ l3 u

1 F" c, c: B) E4 e. I* R: o9 P本文代码:
+ D9 G! }( Y8 |- J/ g, s- Z8 m0 sfunction varargout=LengthSortStr(str)- i+ {# W8 Z3 ]; K* }3 F
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ?+ y* ~* C/ A7 E- I6 s%Argment:                str文件名组成的字符串数组& D$ C$ n4 I* ~( l) i
%        :                输出参数同sort函数
3 }1 O3 e2 I' W# l%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- ^& x; A( v/ Y, r: M  I5 Nch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好' B7 M' \* R* i* N( }) H3 x+ N
3 {: K& v* J0 d7 }
[N,MAXLEN]=size(str);        %个数以及每行的长度
# P9 m. n+ o. y. t# f- B8 b8 E2 znewname=[''];4 J0 x3 \: t3 z, ^
* u; t) w- J3 j4 m% s2 q
for i=1:N
% Y6 [7 m$ R! m8 q        BlackSpace=0;" u- K9 B- G$ n' p, c
        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
7 h; x. `9 ]& u+ c% J$ y                BlackSpace=BlackSpace+1;! D# `9 ~" t: t( K& K2 o5 \& D9 ]$ l
        end2 b4 h6 b1 b  b; t2 P
                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格1 @+ m- l3 u5 @- N) z
        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
+ m" h7 n$ g+ T2 y( \end
5 R% m4 x# @$ L[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
% d  U0 P" l2 |% j' X+ W# ]8 vsortstr=str(order,;                                %由这个序号生成原始的排序名: Z7 R: _2 Y" c! a9 E
( \$ v% _4 m( D/ V
if nargout<=1& F* ~( [6 t! T1 o
        varargout{1}=sortstr;
* k5 r( u$ T2 i" I" r: w  Helseif nargout==20 t0 q3 [7 X7 W! P* z0 p; y2 b
        varargout{1}=sortstr;
0 s- u- U% |0 F- q$ P$ o& e0 Q        varargout{2}=order;
+ M$ h2 a# ^* S6 j- Jend
( h% E& Y3 g' [0 T- [$ y复制代码/ h. N! N* e+ b3 s3 O
实例:
3 I4 y- U$ J: S6 K3 Z%对D盘下面的bmp图的文件名进行排序' q/ f) Z5 O6 V& x
clear# y7 V# m' _4 D3 `, v
dirpath='d:\';                %路径
7 J5 J+ O; r& J3 e, j1 Qextname='bmp';                %扩展名
. {) ~5 @$ x( |& q7 c# V( ]1 Y( J5 _% X6 U
if dirpath(end)~='\'                %如果路径后面没有加\,添加
0 j& q% t: }4 v; |        dirpath=[dirpath,'\'];: \+ `8 F3 r9 h
end. ^( o& I+ Q* `/ d, z7 N! g) E: M9 @

/ E9 _3 F* J  y* f+ Y%先取出目录下的文件信息
) W& b0 ]+ q8 M' m; I) ^pic=dir([dirpath,'*.',extname]);
/ n! T  G9 L7 e: |# Dfilename=str2mat(pic.name); %取得文件名/ A: Q  e+ ~7 b& l+ g* N( k' ?

, e( i$ |. Z" o4 L- ]3 S( I%调用函数' o7 [) X3 j2 [, n. m1 {
sortfile=LengthSortStr(filename)! u# D; q- s$ R) F6 X
复制代码2 n2 D/ B+ d- K! ]1 g* o+ k

- P1 e5 T; {/ C" v' h3 m$ u  k$ L: }5 J& h

作者: 冻鱼    时间: 2015-1-23 12:56
谢谢楼主分享0 p- n' z3 s, A  S. |( _

作者: 15733266829    时间: 2015-2-5 14:57
thank you.!!!+ ^/ d" d% }0 E* s+ Q& Y2 E; I- L  Z





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5