数学建模社区-数学中国
标题:
文件名排序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 ~ V
10.jpg
7 x/ {+ ^$ P8 P" t- @$ W
100.jpg
: D9 P1 Z7 M! h& K
101.jpg
3 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$ s
filename=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# L
str1=['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# j
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
: W% d; U+ R1 E- \ F
% } n' c5 d/ P6 a
[N,MAXLEN]=size(str); %个数以及每行的长度
/ ?1 ^- N7 x' c1 r9 o
newname=[''];
( L( ^. b& M0 Q7 j. Z4 F
% @: z( V9 Z5 e }$ ]+ n- ?! y
for 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. r
end
, 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 V
extname='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! k
filename=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