数学建模社区-数学中国

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

作者: 建不了的模。    时间: 2015-1-20 13:56
标题: 文件名排序Matlab程序
由来:: L) K9 M5 E0 \; h2 [! ]
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是. B4 @; Y/ y% L1 S% x
1.jpg
. i8 A5 D) L7 i$ k10.jpg
1 I, p; `4 r+ V: H7 l/ U) S100.jpg) E$ ^1 o% {, n' [2 {" T$ W6 q
101.jpg
  A8 H/ {+ L  w1 o+ {/ S, U就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。) e4 E, t, ?& v: ^- I% c9 T( O$ m

/ h: I6 V! ?$ a, b当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
6 b  P: i  _! X! f& q5 N/ }当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
) M+ a: y7 [( C: d: _7 B9 A2 R如果不是上面两种情况的话,本文就是实现从小到大排序。
8 _9 O; X; j& k! w3 `; W" z4 s$ j5 e* g

5 T8 N+ D( f6 l1 J2 _提示1:文件名的获取
- b( Z2 n$ d8 C通过dir可以得到目录下的文件名,比如:* W7 n$ l: o( ~- L2 u0 F
jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。" B" p3 d2 h5 v& S0 K1 B4 w
filename=str2mat(jpgfile.name);  & R4 J% r8 Q1 B; G# R. z5 E" \
0 e. u5 `1 }% @+ \" N+ L
提示2:字符串数组7 f3 _- D! A' ?; ~! D7 J' x+ {2 c
先试一下:9 }# ^7 K& I  ~4 M, j& W" X
str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
2 H( \1 j6 B4 r; J" ^- \+ Sstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
2 y' K1 w! i% q- H6 f0 Hstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
7 y  S0 _0 N9 D  l1 C
. ]; E3 X2 ?0 T: a- W, i/ \& C4 F这样就导致上面得到的filename每行的长度都相同。# Y% d+ g7 Q6 q: C- Y; C
, \5 C" h; U  X/ `
8 M- n2 C5 o  Q8 [" b, M% W
本文原理:
+ {% X- O3 @/ Y1 e先判断每行最后面有多少个空格,2 |, i1 I/ `) Z. X3 a5 L
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串1 Z. v' H' a7 v9 A9 ~  L( n
这样排序就可以实现上述的文件名排序功能。
; G6 J5 p- ?+ c$ f. B. {3 |- m! w8 i$ o$ l$ w1 d: e
$ f& k. N8 Y9 V4 E
本文代码:
: w7 @; H  g, i( K7 e( `) [function varargout=LengthSortStr(str)
; ]" g; O# M$ d& h8 ]%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! o$ K+ z9 B  C! ^1 k
%Argment:                str文件名组成的字符串数组
5 {. v2 ~) X0 `) _% ]; e! Z7 w%        :                输出参数同sort函数5 K. ~! X; P0 t( v
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0 ~8 s" Q+ E* c$ M+ s* ~3 Bch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
1 |& i% a2 {) p# v- ?
4 F; Z3 [& P& J[N,MAXLEN]=size(str);        %个数以及每行的长度" `, P3 ?9 ~4 ~- j8 B
newname=[''];0 z; \; G; }  ?+ ?3 R& w8 \
# C5 a. V9 ?+ Q- K/ J% x  A
for i=1:N& R0 g5 [7 \% k3 p7 n! t) X  m: z
        BlackSpace=0;4 M8 M9 U8 d3 m5 m9 P  p; v3 _
        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格  \2 l1 d2 C0 X- |5 ~
                BlackSpace=BlackSpace+1;- j& I, v1 g% E9 x7 U. J: H' ?2 g
        end
! S+ z6 c" _, ]- ?                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格3 l& @' x' P4 H" M* v
        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];4 _+ z! D7 h! n$ L
end2 v% t$ e3 d4 N0 \
[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号' i5 W) ^' B: H5 b( h& b% V
sortstr=str(order,;                                %由这个序号生成原始的排序名% c) ?8 Q4 Q9 K2 P( j) a

; c; _  c0 Y6 N* v$ Aif nargout<=12 }2 f5 a% Z# M) M  V
        varargout{1}=sortstr;# ]9 `' M4 j5 o7 {; p$ h
elseif nargout==2
& @; H% y9 O  s  U) t, n        varargout{1}=sortstr;8 ~$ G0 f. e& b5 |
        varargout{2}=order;
) \- B$ f2 R! J: H, ]end
4 g2 K6 V) n' a- ?8 _复制代码5 S! _# h  f, B5 \" D
实例:$ ^3 H- M! s9 a$ V/ Y1 x
%对D盘下面的bmp图的文件名进行排序
* n# A2 Y& i) Gclear0 l7 [) c$ h: j
dirpath='d:\';                %路径
$ D$ ]3 W( j; Q3 o7 R' fextname='bmp';                %扩展名
! p1 J5 Y+ o9 K" P# o! y0 u6 S9 B. u. Q
if dirpath(end)~='\'                %如果路径后面没有加\,添加" W" s- w& ?3 e* r* q. T
        dirpath=[dirpath,'\'];$ M9 G; I; n; e1 `) v1 w* {
end
+ ?: B: Y: f" ]# T( M: y* ^3 f7 d" h* M6 K) H# q" j
%先取出目录下的文件信息
2 ^. P; C+ |/ D- _. upic=dir([dirpath,'*.',extname]);
) D1 P6 c2 X- }; _9 }6 pfilename=str2mat(pic.name); %取得文件名
$ N! D- A+ E6 @  n! Y! e
6 C' ^; n$ f' o7 |6 X$ U# ^$ ^9 Z%调用函数0 X! g. Y0 b& }" @9 D' u3 D
sortfile=LengthSortStr(filename)5 y& Q4 {; g5 o* K, b. e; {
复制代码; z0 `9 n! z  L! H. i; B; X& u

6 o3 X( A+ ^8 V6 h1 I) F4 }2 ~% h; {6 T4 j& v0 s4 q" G% L

作者: 冻鱼    时间: 2015-1-23 12:56
谢谢楼主分享
1 z, B9 @& w5 l  O; ?* g$ ?" @/ R
作者: 15733266829    时间: 2015-2-5 14:57
thank you.!!!
" e- r$ l0 J$ S# r




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