数学建模社区-数学中国

标题: 文件名排序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: l100.jpg
8 D& h) \! l- d5 u; i* c* ]101.jpg9 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. Bfilename=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 kstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
8 ?+ M" P9 G/ r* F. K0 U  a5 Istr3=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" tfunction 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" pch_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; @' Aend' `* l0 [, O3 l8 c6 e' C
[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
7 p3 b; p; ]7 s& Hsortstr=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 \: @+ hclear5 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% Pend
2 z% `+ s9 d0 ~, V# t6 o2 o( t  B9 r
%先取出目录下的文件信息
, p: P- I6 T: g0 s& W2 N1 f! Zpic=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