数学建模社区-数学中国
标题:
文件名排序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$ k
10.jpg
1 I, p; `4 r+ V: H7 l/ U) S
100.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" ^- \+ S
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
2 y' K1 w! i% q- H6 f0 H
str3=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 B
ch_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
end
2 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$ A
if nargout<=1
2 }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) G
clear
0 l7 [) c$ h: j
dirpath='d:\'; %路径
$ D$ ]3 W( j; Q3 o7 R' f
extname='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 f
7 d" h* M6 K) H# q" j
%先取出目录下的文件信息
2 ^. P; C+ |/ D- _. u
pic=dir([dirpath,'*.',extname]);
) D1 P6 c2 X- }; _9 }6 p
filename=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