数学建模社区-数学中国

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

作者: 建不了的模。    时间: 2015-1-20 13:56
标题: 文件名排序Matlab程序
由来:: Y8 M  ~0 ]/ j7 e) N
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是9 j# Q% W  r2 z& `2 K* d# q: G
1.jpg
6 ]# a: x( o6 D2 ~6 ~0 ~  V10.jpg7 x/ {+ ^$ P8 P" t- @$ W
100.jpg: D9 P1 Z7 M! h& K
101.jpg3 i5 k- y- Y# ]" e! V4 t
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
9 K- }- |+ F2 I/ ^0 l
& f& C0 N6 D. \7 h7 R; D当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。& o( A6 t! F( G6 g' S/ [2 w, w
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
5 ]0 u- j: ~- v: e) b如果不是上面两种情况的话,本文就是实现从小到大排序。
# g6 ^3 P) U6 X3 @/ _
$ m! t/ J- ^, s4 k/ i$ ~$ l7 _2 ~4 p  w8 Y0 m' {
提示1:文件名的获取
. \4 [6 z9 c; B- v  ~2 |通过dir可以得到目录下的文件名,比如:6 T6 t0 A# `1 s, w7 d
jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
  b4 V8 w  e$ sfilename=str2mat(jpgfile.name);  ! N9 ^1 g5 k; \) c- r* T+ W

5 v+ L3 x/ _1 e/ x) c# l提示2:字符串数组
  N9 k5 L- j" z- }& M! t先试一下:
' J: O9 P- {7 K: g: @5 G# y# Lstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同8 N, T4 \6 f5 h9 a" S
str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同/ X& k" v7 N% Q' `
str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。( O4 p3 t. `& `% R- K4 @3 J

" n$ ?1 E' u  I- L; p4 @这样就导致上面得到的filename每行的长度都相同。7 M; x) v$ T  M+ L) D; a& V

* d2 ~! e  U# @/ J! ?
4 d' i7 F6 Y9 b; M! a本文原理:
0 g4 c1 v' i! [' q" J9 ?3 n3 P9 W先判断每行最后面有多少个空格,
1 M9 \0 a4 d/ p* K, H5 m0 X然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串9 u+ f1 j5 C+ x1 J: o
这样排序就可以实现上述的文件名排序功能。* Q$ R# ?/ U* ]  N1 h# }! Q: g

3 X7 T' ]: q+ w5 \0 G9 \
& n/ G# n! u  b! j( g$ F# g本文代码:/ |* {4 G2 \, d2 ?. `
function varargout=LengthSortStr(str)( t* s) f8 p6 _: m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# ]+ E: U1 v6 g- \, H
%Argment:                str文件名组成的字符串数组4 R8 I  ]8 Z1 J9 {
%        :                输出参数同sort函数
- N' ~: x8 \: _4 z5 A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 m  w0 J2 G, ?; U# jch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好: W% d; U+ R1 E- \  F

% }  n' c5 d/ P6 a[N,MAXLEN]=size(str);        %个数以及每行的长度
/ ?1 ^- N7 x' c1 r9 onewname=[''];
( L( ^. b& M0 Q7 j. Z4 F
% @: z( V9 Z5 e  }$ ]+ n- ?! yfor i=1:N( }6 g; i. F8 x5 B& D! U2 R
        BlackSpace=0;5 V0 ]" k# G9 h8 H- H
        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格5 \' [4 k3 t# Z
                BlackSpace=BlackSpace+1;$ k4 P8 {9 o2 l$ ^' r; j
        end
; O- ~% c7 E* O$ P: u2 W                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格6 ?- x7 ~5 e% t
        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
# @! j% h# X. rend
, W0 [, x. }6 t% ^7 {[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号* @. G( P! O6 e. Z. a
sortstr=str(order,;                                %由这个序号生成原始的排序名% I' q. c0 U! g6 T0 |* Z& A8 k
3 ?) n8 e4 o/ P0 l' [  g* h
if nargout<=1
) J5 O% i% l/ y/ w        varargout{1}=sortstr;  k7 K' }( h4 j7 z
elseif nargout==2
# X( e7 u' {9 @/ m        varargout{1}=sortstr;7 C* ~) _# e: ^1 q# l
        varargout{2}=order;% u$ j' R( X. U* d. h
end' \' c7 F9 \  F0 [( j3 f
复制代码; q0 `/ P; K$ [: t/ f' g
实例:
+ x" [/ }, f0 b7 t, S- {%对D盘下面的bmp图的文件名进行排序% Y( b4 [5 m- j) [
clear: B" d9 L' A* R- r3 L( k( q" A$ ~
dirpath='d:\';                %路径
+ ~9 J7 A7 P, n) G" X5 Vextname='bmp';                %扩展名$ R7 t7 t. x- [! \
2 |6 K  `" B3 D0 w
if dirpath(end)~='\'                %如果路径后面没有加\,添加
( [) m% s7 R9 B        dirpath=[dirpath,'\'];' o" J) k0 J) Q) }4 ~
end
) r+ L# V- z/ I; B. y5 V. N3 F3 U( d. n
%先取出目录下的文件信息3 m" A2 G+ a2 r: I2 z" o
pic=dir([dirpath,'*.',extname]);
' N. K: y8 b6 J- ~! R2 H( _" X! kfilename=str2mat(pic.name); %取得文件名
7 F6 N1 _( ^- W# @* E8 I, r6 V! O, h0 S6 L# J7 J4 k- S2 m( M
%调用函数  k2 K/ x' q9 y. ]
sortfile=LengthSortStr(filename)- h9 S( ~6 ~5 \* ]- n0 T
复制代码2 I  E7 {$ i# m& v* y

4 W  B4 K8 V% T9 v$ ^, j# t7 H4 ^/ A  h3 V/ x6 D

作者: 冻鱼    时间: 2015-1-23 12:56
谢谢楼主分享  |3 u  E, |& @* F# S8 D4 \- i

作者: 15733266829    时间: 2015-2-5 14:57
thank you.!!!# t' Q, l$ X5 H4 @





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