数学建模社区-数学中国

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

作者: 建不了的模。    时间: 2015-1-20 13:56
标题: 文件名排序Matlab程序
由来:: E* k. b  F9 p2 H# g2 [! B
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是# O9 R2 t, U1 y/ ~
1.jpg# O$ s8 u4 d3 I) |& e' F
10.jpg7 o' R" f1 N  }. n
100.jpg
4 Q$ X5 q, J- k! p9 r* O101.jpg% F, f; ^; Z* R7 d% c* y0 p4 j. T/ n
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。5 a* ?  Q  x0 o

* t4 V3 t" n4 A9 `; x4 O- n4 s# O当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。3 _# Z0 B8 M: ^- L2 H* N& A2 Z, r
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。4 d0 ^) W) ?/ p+ c0 c
如果不是上面两种情况的话,本文就是实现从小到大排序。# {) k8 g3 S/ q/ H4 p/ t

+ W" {$ z0 o  H! N4 @3 W
: x& o' ]( o& y' d- E8 r提示1:文件名的获取- z# T, u( u! N# H/ P& E
通过dir可以得到目录下的文件名,比如:! O( C2 k5 a; J" a! s: L
jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
0 j" u; n/ _6 Q8 y9 r2 ifilename=str2mat(jpgfile.name);  
* T; ~, w8 c5 C' T! w. ~0 f0 r$ f) @' i6 Y1 @) y1 Z
提示2:字符串数组3 ^+ @3 Z* C8 d- f4 S3 t
先试一下:. f3 _" C3 K; O) l, g: U
str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同+ Q5 v$ Z9 K" f+ a8 r  A
str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
; U0 y7 {1 r, S; w# [str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。) p8 r. [- w/ b: n3 Q$ a

9 j5 T  {: a6 q9 |& _# P* D" Z这样就导致上面得到的filename每行的长度都相同。
% x- C2 h0 d3 K: [2 p% X! L( C. h, B0 |( w  P) a3 R: G
' x1 `" q- V! W0 q- B
本文原理:
  L# F5 u# ]- ~! P7 _+ ^9 ^6 o9 n先判断每行最后面有多少个空格,  y8 g/ [+ ]- l# T; u' Q! R: ^
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串: x9 O% r" ^9 j4 `+ H
这样排序就可以实现上述的文件名排序功能。- d5 b/ M, Q2 Y9 s
! I7 z" M5 b- W5 {
1 Z3 ^  s8 B/ i
本文代码:* ?6 k4 D. x" n3 \4 [0 ~3 c
function varargout=LengthSortStr(str)
6 n" p) A% n; z0 a. M% k%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 N9 W2 g7 ~+ I%Argment:                str文件名组成的字符串数组
7 J% b/ i6 H8 E! T; S, M+ Q%        :                输出参数同sort函数( y0 A& b5 |+ C" I
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
, E8 B- q1 A- Vch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
  S4 S( Z: I  N$ s  _2 u; l4 T. _) b# _2 [& N
[N,MAXLEN]=size(str);        %个数以及每行的长度
7 E3 B& h5 P8 Z! G( [8 Enewname=[''];' h1 I  r  d( b) e) G1 ^

& g# \, r. w: ], X8 G2 ifor i=1:N
9 h) q7 u# o+ j% i        BlackSpace=0;
) Y* b3 p% {3 r' w* M        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
1 i, C0 g" r; L5 v                BlackSpace=BlackSpace+1;3 s- ]5 q( l; D- N1 N+ G
        end
8 g/ ]4 T' a$ H6 H- R8 j                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格1 h/ D" k, L* ?. T7 N
        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
8 n8 U) q7 G( c* C) Rend
& x) O$ X) D7 _[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号9 l9 H* H& U) ^& C& s
sortstr=str(order,;                                %由这个序号生成原始的排序名
8 Y7 B* G5 j( A2 ~
2 M7 @6 G) ^- J0 Q. |3 Wif nargout<=1
7 E/ w: Z6 G9 L/ v: P9 g        varargout{1}=sortstr;; D8 M, E0 l5 \' R
elseif nargout==22 @% B0 R; {: J  M4 N+ S' c
        varargout{1}=sortstr;' i+ J' [  o* Z4 ]& @
        varargout{2}=order;
9 A- `3 Q0 s' _+ o3 G7 xend
+ G" F4 L* M) U( {  P复制代码& |5 m7 v1 F0 F6 ~/ M8 N8 v
实例:/ z2 L, C. h. [3 ]- D. r
%对D盘下面的bmp图的文件名进行排序
$ E' ?1 d$ @: d* T8 u. a$ I) s3 d. lclear6 v6 e9 Y( c& k: m8 ~$ S- `0 v
dirpath='d:\';                %路径
1 o9 w, P/ k9 Y' q0 Oextname='bmp';                %扩展名7 U- o4 t; f4 D. @" H& z
7 `; x3 z9 |  b( p, h* m! ]" {6 ~
if dirpath(end)~='\'                %如果路径后面没有加\,添加
$ J7 \/ }% H+ i) C# g9 o1 @        dirpath=[dirpath,'\'];% D  @7 h# C, L) }1 q3 h% ?
end. L. a" ~0 l! D$ k
% ~  Q: u& @$ W3 _7 z; a1 s+ Z
%先取出目录下的文件信息
: Y% s! c+ x' M4 x( J3 l3 Q7 d" P, [pic=dir([dirpath,'*.',extname]);$ V9 ~( z; G; |3 K2 o
filename=str2mat(pic.name); %取得文件名/ H5 k( X& r! c2 h  P

: X' K/ M- N$ O/ O%调用函数
/ M5 n% l/ C, `) Y8 k; jsortfile=LengthSortStr(filename)
* h* ?" X2 H" @' a% s复制代码
, D+ f* j2 k/ u0 U+ ^5 Z  q& w8 U' I
" w. C  S$ R- m0 c" Q; [. C( Y
0 m( }$ w6 K  b; U; _. o+ M2 R2 I
作者: 冻鱼    时间: 2015-1-23 12:56
谢谢楼主分享
8 ]  G' F8 l: u$ _# z4 Q4 W
作者: 15733266829    时间: 2015-2-5 14:57
thank you.!!!6 S: l% g% t2 M1 I+ n& v/ t





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