数学建模社区-数学中国
标题:
文件名排序Matlab程序
[打印本页]
作者:
建不了的模。
时间:
2015-1-20 13:56
标题:
文件名排序Matlab程序
由来:
6 z* z9 m- i9 R5 z& c
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
( g" Q( ?& p$ d( H
1.jpg
* h; ~, U7 d1 h P- w$ l
10.jpg
# ^* p* e! B8 S# Q: l
100.jpg
8 D& h) \! l- d5 u; i* c* ]
101.jpg
9 m: [4 n2 N, y3 q. L" x' i
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
% `, E& b6 {! }) e- f9 }" F8 m0 S, \
y. u. M L/ ?! y
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
7 M; y! ]* u9 D F4 v* ]0 t* O
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
$ R4 L* ]4 Z G2 E! A1 W* [
如果不是上面两种情况的话,本文就是实现从小到大排序。
! p5 X+ U3 a9 u; _5 ^& o
, ^! A+ [# z5 m( Q4 y2 {
$ z1 t5 _8 r2 n/ F3 J
提示1:文件名的获取
% C- u- ^0 @/ r
通过dir可以得到目录下的文件名,比如:
0 F) E9 E' P4 V$ r# E# \% k
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
# G! i$ W0 X# u6 e, x; H) x. B
filename=str2mat(jpgfile.name);
1 S9 z! ^% |$ a) ^
0 }- m- e4 U- x5 A' \+ v
提示2:字符串数组
6 k$ }' h' C6 H2 ~. h
先试一下:
6 c$ h3 I0 B1 f) ?
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
) M6 m) a& I8 Z3 k
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
8 ?+ M" P9 G/ r* F. K0 U a5 I
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
& K4 B' Y2 c i( X7 M
% z7 i" p9 k# @! \6 \! h. i" e
这样就导致上面得到的filename每行的长度都相同。
/ D- a4 A, P I
L& G9 t+ E. n8 }9 P; U
b+ U' C$ e% G# I) s
本文原理:
3 e. {7 X- A6 k5 ?: p
先判断每行最后面有多少个空格,
+ ?" O- r1 ?2 Q, v! Z# W& x
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
[' m7 o# x- o2 ?
这样排序就可以实现上述的文件名排序功能。
3 A- }& z _: T. W y- S
% V3 S9 I0 Q: b; h7 f9 i: g
7 Z8 L$ g+ ~% L3 b6 K3 H( _
本文代码:
9 g2 `8 ]5 x# Q/ O3 Y" t
function varargout=LengthSortStr(str)
8 ?9 |: {$ k; C
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. o8 A! f, s- G8 ]$ j/ O
%Argment: str文件名组成的字符串数组
5 \8 G+ ?) l4 X" [; B
% : 输出参数同sort函数
5 q2 |5 _8 N" x5 j& F9 U. w" @
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. n/ a9 P: k" p
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
4 \+ Q; C( E& l* p; W) q
2 {9 t: S8 i/ ?- b7 c" w
[N,MAXLEN]=size(str); %个数以及每行的长度
5 y- q$ c/ j" ?
newname=[''];
0 x8 ?4 U k8 f
: f0 g$ ~2 `+ u( B
for i=1:N
' r+ E( j$ R" c, m' g$ [" V
BlackSpace=0;
% h1 ]& O" L8 v+ ~/ o* V
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
2 ~& O- J+ M+ P& E9 V) J7 P/ ^+ D, E
BlackSpace=BlackSpace+1;
' V3 ?5 K4 I2 h( Z2 R/ r
end
! R, P! v2 S6 Z/ q- X9 i
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
( a- V1 @4 M6 b3 K# ^% A/ K
newstr(i,
=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
- {# ~- G* j6 x; @' A
end
' `* l0 [, O3 l8 c6 e' C
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
7 p3 b; p; ]7 s& H
sortstr=str(order,
; %由这个序号生成原始的排序名
+ q9 o& Z9 B, y) c; Z/ J8 d+ S# j. E0 D
# x$ Z6 N6 L" S3 }
if nargout<=1
7 f+ R2 X @/ [
varargout{1}=sortstr;
$ d1 r/ S' h6 ^8 Y; L
elseif nargout==2
9 c4 A" H- [' \: c& g
varargout{1}=sortstr;
8 C) ~8 \: ~. N; U1 N% F2 B" ]1 Z& Q& r
varargout{2}=order;
+ O* j2 ^3 W7 z
end
, F9 x, ~9 _" R! G' V
复制代码
& G( ?8 S- [' k+ K6 X& u* u
实例:
: I/ R5 T# _0 ]! }5 _5 u1 C( k
%对D盘下面的bmp图的文件名进行排序
7 E, q+ d9 \: @+ h
clear
5 t# q; S3 A" A! K* `/ c& y f
dirpath='d:\'; %路径
- o4 X* r3 g1 g) E* ] J
extname='bmp'; %扩展名
8 e' U8 {' a3 C) {- L0 B J8 R5 z% V
: q2 z: e: l) K S. S {
if dirpath(end)~='\' %如果路径后面没有加\,添加
1 ~$ a4 q1 @# g' Q5 Z- c" T
dirpath=[dirpath,'\'];
3 x5 I a4 z% P
end
2 z% `+ s9 d0 ~
, V# t6 o2 o( t B9 r
%先取出目录下的文件信息
, p: P- I6 T: g0 s& W2 N1 f! Z
pic=dir([dirpath,'*.',extname]);
2 @" g$ x& u* q0 X% v% l
filename=str2mat(pic.name); %取得文件名
: O: x4 d; t/ f" g3 j4 U
Z6 W# l! @8 r# x
%调用函数
$ a7 T7 Z3 p9 v$ U+ A m# }
sortfile=LengthSortStr(filename)
+ ~3 Z8 U; \/ @4 M" _. [' E
复制代码
+ a& Z5 @7 z, U" M- j
. r4 T# g) @: O" P9 t
# C8 t+ W0 J6 l# l5 I9 n
作者:
冻鱼
时间:
2015-1-23 12:56
谢谢楼主分享
1 z# b: q. |/ [# f+ c3 O
作者:
15733266829
时间:
2015-2-5 14:57
thank you.!!!
+ N( w$ ^5 e, B6 W. Q n
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5