数学建模社区-数学中国
标题:
文件名排序Matlab程序
[打印本页]
作者:
建不了的模。
时间:
2015-1-20 13:56
标题:
文件名排序Matlab程序
由来:
) }7 z- Y# ^7 L2 v( h1 N
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
/ R( k6 H! \ n' d# Z5 H
1.jpg
4 ]/ h8 O S" ]
10.jpg
" ~/ b1 P' j9 {/ f; C/ g
100.jpg
* @0 _4 d! _2 ]- X; X! _* G! h, ~
101.jpg
. q7 X: `) [ V8 U! S5 N/ q
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
, i* v& W& j+ I) l, ~
8 f3 C' v: N- F9 N- \
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
2 Y/ `8 k! f P" q
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
$ y0 f N5 \! I7 ~/ T h
如果不是上面两种情况的话,本文就是实现从小到大排序。
3 x: t B7 A' n# h4 s; L7 y6 r9 N
5 C8 r8 d7 ^2 |- [0 R
' F/ u( H: g/ \) t# L+ X5 d9 t) C* ?
提示1:文件名的获取
( e! f9 U% S$ Y+ P
通过dir可以得到目录下的文件名,比如:
+ h, ?% F. B' U5 W- j
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
& }! Z9 O4 Y$ Y: i3 C4 H$ ]0 R
filename=str2mat(jpgfile.name);
( x( g, F+ V3 v6 g3 _" r$ i
/ I+ l. C, G; f5 V7 j5 O
提示2:字符串数组
# b$ z- b9 |6 [! }% m
先试一下:
8 d) X5 `- Q% Y3 u% C+ c
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
3 }& ~; ?! I& l% f' w v- Y; Z" P
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
. n- V0 h B# t F
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
% c8 o# S9 W& c# D3 b( j
8 m& e0 r' B( Z4 z8 W! _0 P
这样就导致上面得到的filename每行的长度都相同。
2 e4 ~+ D% |( n! C: _
% ]. g4 \) h0 j5 D* ^. f+ o
# R1 X4 W6 e' d8 k
本文原理:
9 b) U9 l, C" b5 @' F
先判断每行最后面有多少个空格,
) y9 [/ k3 J# c) b2 Z
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
& o$ C" x; N1 O" [7 Q/ \
这样排序就可以实现上述的文件名排序功能。
/ P' i4 N7 U9 J7 J3 n) J' Y4 t o5 k6 E
7 s Q. P$ @0 t% m7 X
6 g. f$ e2 H, C# \7 ~
本文代码:
, Q( X- _' c; A. X
function varargout=LengthSortStr(str)
. e7 r) I9 t% G0 k
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \% D, F- Y s+ G6 N
%Argment: str文件名组成的字符串数组
}6 \/ Z# \. F1 Z# W& N! s, z
% : 输出参数同sort函数
4 Y) E# F: c0 x V! g
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! v/ p7 g3 {0 K$ I2 X6 G
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
( b% B: ^( o9 D1 l$ c
: j8 k# I" K9 B5 E+ u
[N,MAXLEN]=size(str); %个数以及每行的长度
! m6 q$ t# @& c0 L
newname=[''];
) L* `# u% s1 ]8 S( @7 c. c
. F* {3 Z6 q) v9 ] I
for i=1:N
9 p d2 a; C% @# F' r! i
BlackSpace=0;
4 q7 X1 U1 Z. G1 D+ f1 m3 l; L
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
7 j6 s$ H- B1 _, H- E0 y& p8 B9 J
BlackSpace=BlackSpace+1;
/ v/ Q* w3 M ?5 j3 F. I& m G
end
* n L) ]8 a5 `, A
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
& S w: G/ t1 W6 t' \- k! F
newstr(i,
=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
; ^. P E2 ]; `3 C$ F" @4 W$ \
end
7 s5 \' d0 u3 n0 P/ H
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
+ x- a" }6 \" S) [( m
sortstr=str(order,
; %由这个序号生成原始的排序名
9 f- M# i0 t4 r# {! p1 [
) s+ [9 L/ K. A) `) Z. U3 [/ a7 j
if nargout<=1
% Y, T) o/ u* M
varargout{1}=sortstr;
8 l# j1 [7 Z( M0 e) F5 `) p
elseif nargout==2
: g* A. G7 L2 u# H
varargout{1}=sortstr;
4 y% \1 O; T' j# m' [5 ]* M
varargout{2}=order;
: `# p+ ?1 q+ j* F. @
end
$ E" b: E/ t8 H
复制代码
5 G/ y8 E6 a J7 j u+ W& G8 V* f
实例:
5 ?0 O+ M& a! u+ C, X; y& o
%对D盘下面的bmp图的文件名进行排序
6 N% J# ?( Q& E) L) P
clear
9 r$ q/ v3 H2 @/ p9 [, o
dirpath='d:\'; %路径
8 @4 q/ ~$ v/ B% x, M- Y! W
extname='bmp'; %扩展名
/ L- n6 R# d0 y0 g
9 j. U, @) I0 n! ]" Z3 J/ e
if dirpath(end)~='\' %如果路径后面没有加\,添加
2 j& c5 j/ ?3 f9 R( B( O
dirpath=[dirpath,'\'];
+ E9 R# e0 i$ I# f
end
2 @; f! P0 F" u( m- g2 ?" t
: V# d7 v0 b+ O
%先取出目录下的文件信息
, f0 H/ k' J0 q. E; ~8 A/ J' U
pic=dir([dirpath,'*.',extname]);
$ ]# P% l2 e: L" h
filename=str2mat(pic.name); %取得文件名
# a! \+ e! Y% i% ~6 i- M2 Q; u
: @8 g1 U" f: H" ], p
%调用函数
( p( h( g5 i2 B# K8 `3 D9 a( P. a
sortfile=LengthSortStr(filename)
* K$ l8 D. T$ h: ^! I' R/ B
复制代码
6 s# h# T6 j+ f5 z+ B% {
E( B- s% @% J1 O+ S8 M# ~( D
6 P( k& j/ _6 m% y6 x
作者:
冻鱼
时间:
2015-1-23 12:56
谢谢楼主分享
+ T- D/ Y* Y( w3 o
作者:
15733266829
时间:
2015-2-5 14:57
thank you.!!!
& Z- s3 L& A2 n6 U
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5