数学建模社区-数学中国
标题:
文件名排序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.jpg
7 o' R" f1 N }. n
100.jpg
4 Q$ X5 q, J- k! p9 r* O
101.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 i
filename=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- V
ch_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 E
newname=[''];
' h1 I r d( b) e) G1 ^
& g# \, r. w: ], X8 G2 i
for 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) R
end
& 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 W
if nargout<=1
7 E/ w: Z6 G9 L/ v: P9 g
varargout{1}=sortstr;
; D8 M, E0 l5 \' R
elseif nargout==2
2 @% B0 R; {: J M4 N+ S' c
varargout{1}=sortstr;
' i+ J' [ o* Z4 ]& @
varargout{2}=order;
9 A- `3 Q0 s' _+ o3 G7 x
end
+ 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. l
clear
6 v6 e9 Y( c& k: m8 ~$ S- `0 v
dirpath='d:\'; %路径
1 o9 w, P/ k9 Y' q0 O
extname='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; j
sortfile=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