数学建模社区-数学中国
标题:
文件名排序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; f
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
+ J) E& a" Z1 g$ U2 E0 ^* E
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
! p, x. x& @; k; i* G
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
& r3 I2 H$ P: V( r4 G& t$ V( J7 P
3 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 s
function 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 N
ch_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 z
newname=[''];
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
end
2 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 v
sortstr=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 H
elseif nargout==2
0 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- J
end
( 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 Q
extname='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: |# D
filename=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