数学建模社区-数学中国

标题: 文件名排序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.jpg4 ]/ h8 O  S" ]
10.jpg
" ~/ b1 P' j9 {/ f; C/ g100.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- jjpgfile=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+ cstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
3 }& ~; ?! I& l% f' w  v- Y; Z" Pstr2=['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. Xfunction 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 ]  Ifor i=1:N9 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 [, odirpath='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/ eif dirpath(end)~='\'                %如果路径后面没有加\,添加
2 j& c5 j/ ?3 f9 R( B( O        dirpath=[dirpath,'\'];
+ E9 R# e0 i$ I# fend
2 @; f! P0 F" u( m- g2 ?" t
: V# d7 v0 b+ O%先取出目录下的文件信息
, f0 H/ k' J0 q. E; ~8 A/ J' Upic=dir([dirpath,'*.',extname]);
$ ]# P% l2 e: L" hfilename=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. asortfile=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