数学建模社区-数学中国

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

作者: 建不了的模。    时间: 2015-1-20 13:56
标题: 文件名排序Matlab程序
由来:
' ?; z$ B) Z# Y; ]( D" G' h* V  S手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是% r5 W" N3 w0 k4 S3 u" B/ \
1.jpg
$ ^  V6 l" b" _! B# X2 i10.jpg9 t! R& r4 D' Z7 {/ S4 B1 q( f
100.jpg7 e5 Z: a9 @# w- i: Z- a& ~; U  w# z
101.jpg
1 S4 @2 W5 R1 E. P3 w就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
$ Q8 B$ c$ i5 [7 o* N3 r5 k6 U. c( w+ |+ D
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
5 b. N+ H5 z0 _) ^当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。' n8 c" r$ \* Q0 F; |  t" b
如果不是上面两种情况的话,本文就是实现从小到大排序。
: s3 o7 }+ {% X/ C) E' L
% [# d7 U) W. s! ^/ J7 K6 j. k; p$ f
提示1:文件名的获取7 V' S- X7 }( ]# t4 a* J
通过dir可以得到目录下的文件名,比如:1 ?; Y* r1 H7 Q0 k% J
jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。& x4 ?8 [/ `( I: l( y/ [
filename=str2mat(jpgfile.name);    ^6 g7 o( w0 I7 ^& r2 m+ T
/ w! V$ }2 s) s
提示2:字符串数组. @+ p% z7 c$ t
先试一下:7 |1 j3 t! g+ h4 c8 G" m
str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
7 D% k/ [$ ^: Fstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
+ ], C6 w/ }7 F7 B& c6 ^6 j+ Wstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
5 B( q" O/ B  a: S2 @
2 x6 M5 e* \' e6 A' L, u这样就导致上面得到的filename每行的长度都相同。, ~! {0 H& N6 s! P
  x- I. ]3 i# f( }# T) T1 I! i) {

& U. y. v% A3 o本文原理:' C' \" `7 y. x9 K
先判断每行最后面有多少个空格,* ?' o- n+ T! Y/ V5 }/ `
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串' ~) l4 ?9 g: o2 m9 M. Z+ d
这样排序就可以实现上述的文件名排序功能。
" X& J% S% L3 J* |* U, F2 c3 B0 G; X" a3 Z

* p* j  r% q" F& J$ l7 A& _+ B' |本文代码:# M; s4 \/ R. G3 t9 s- N
function varargout=LengthSortStr(str)
; s" `# y$ m( G8 [) \/ U2 }%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& ^2 E8 {3 i& g* G/ l% `3 b
%Argment:                str文件名组成的字符串数组/ k: P/ t- Y1 S* Q' W. E5 t
%        :                输出参数同sort函数0 ~* b/ Y) `: |0 w5 A
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& O& z7 H1 O" ]1 S- E
ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
1 a5 A  p( I, i' _( r0 H, L7 o8 ], j3 \. b# S4 H
[N,MAXLEN]=size(str);        %个数以及每行的长度# ~9 f, M' M% n( U0 q- e
newname=[''];
% x$ v3 G0 L/ P9 v; D9 K  x9 b7 |* g; D
for i=1:N
7 y0 e5 i' I7 e2 }9 W, M        BlackSpace=0;
1 i( _  R1 N% A! u' w2 D9 o: j        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格: A# F. I5 F5 B  ^* u% \) X
                BlackSpace=BlackSpace+1;; k& T" u4 q. a1 o; C
        end
9 h! m5 x* O9 j: p; F3 `+ Y                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
, \" {& ]5 e; h/ }' y. N8 }( B        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];7 b% q. T0 W. }# w2 w# c
end
& t: H- N7 ?( j6 X" N' u" x# n* K4 R[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
5 ]) {% c" W: k; @& tsortstr=str(order,;                                %由这个序号生成原始的排序名; q/ Y; ~) G5 V, A. Y" _5 I
) z  j: h, |. R3 M
if nargout<=1
7 r9 P" o( X/ I( h: ~% w) O- b$ l        varargout{1}=sortstr;4 C9 f  \+ e: I& L; m- h3 e
elseif nargout==2. x- B0 {" J7 I, r: H8 s2 L' A
        varargout{1}=sortstr;
( }  u8 ^8 H. @/ y# a$ e        varargout{2}=order;% m! B& X& w4 F. b, r* l
end
! o, s; @* M) v  w/ p- I' t复制代码+ m3 D" ]6 C& S, F
实例:1 ]9 n+ Q- T0 G% Z, t4 b% ^/ G
%对D盘下面的bmp图的文件名进行排序+ x( n. ]6 N- `1 O4 h$ J
clear1 z" X' `% U+ h% y" \+ n; A7 ?
dirpath='d:\';                %路径
) p( _* K2 S8 Iextname='bmp';                %扩展名
1 R, L: |7 V2 x6 a
+ f. y7 G8 t6 Y4 M  gif dirpath(end)~='\'                %如果路径后面没有加\,添加6 Z$ z7 {# R" ?1 v& G& K
        dirpath=[dirpath,'\'];: F6 w% S$ K+ ?# z/ _" z( b4 z7 P
end2 E( j2 D6 H# p* Q3 F

5 c: g5 u3 j) Z+ v, e& n%先取出目录下的文件信息0 n% H$ u. G" ]" g
pic=dir([dirpath,'*.',extname]);" K; J9 A- s; M: l6 G+ A- ]+ g
filename=str2mat(pic.name); %取得文件名6 J/ @- ^& M, W) O
, p: Z2 h) A& L& f( K, H
%调用函数
" k+ o, A& D) c0 I  ^& f4 Csortfile=LengthSortStr(filename)
3 j0 m" v! i1 t2 p8 y- j3 E复制代码& Y: x2 x8 G: N! @3 m

+ |8 H. I) b& t/ k9 _8 v& ]$ a+ X# @$ ?- C( b9 S6 i

作者: 冻鱼    时间: 2015-1-23 12:56
谢谢楼主分享
, y; X9 N7 V. F4 `( E/ @
作者: 15733266829    时间: 2015-2-5 14:57
thank you.!!!! [! b5 y' C! W( O$ G





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