数学建模社区-数学中国
标题:
文件名排序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 i
10.jpg
9 t! R& r4 D' Z7 {/ S4 B1 q( f
100.jpg
7 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* N
3 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/ [$ ^: F
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
+ ], C6 w/ }7 F7 B& c6 ^6 j+ W
str3=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 c
3 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; @& t
sortstr=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
clear
1 z" X' `% U+ h% y" \+ n; A7 ?
dirpath='d:\'; %路径
) p( _* K2 S8 I
extname='bmp'; %扩展名
1 R, L: |7 V2 x6 a
+ f. y7 G8 t6 Y4 M g
if dirpath(end)~='\' %如果路径后面没有加\,添加
6 Z$ z7 {# R" ?1 v& G& K
dirpath=[dirpath,'\'];
: F6 w% S$ K+ ?# z/ _" z( b4 z7 P
end
2 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 C
sortfile=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