找回密码
 注册
关于网站域名变更的通知
查看: 459|回复: 2
打印 上一主题 下一主题

matlab批量读入数据文件的方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-17 09:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
网上搜集的几个代码,很有用,保存。
; M! |1 Y8 [: Z  F6 O! k
' I( J' C$ B- J6 I! N++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
( s/ t: N' h1 c; o# i# [! ]" G/ Q2 D: t8 J/ t
1)要读入的文件下的文件名称依序列的方式命名,如a1b.mat, a2b.mat,...,ajb.mat,...
& X/ ~( N5 e# C3 L" M: Q7 H0 r$ @8 M. W: D( ^' h
   循环读入
, Q  Z) a2 T. ?4 u
, T! X% z% z  a- I% C, q, F# l3 R   filepath='';%文件夹的路径
! w1 ^* s5 B3 A5 a- Z2 ^, t2 ]* q- e/ h
   for i=1:n  %n是要读入的文件的个数
# Y: `& r3 f- F# N) o- W: @
1 p9 {! a* y( B, b       load([filepath 'a' num2str(i) 'b' '.mat'])* n( P9 y! ~4 d- G
* A0 W0 t% e: l, r! ~; D
   end4 a5 i( b+ E* \3 L

- L: w2 m9 b& a8 x  Y
/ s7 U" U8 I6 K; H( ~/ W' d+ N8 D" v7 b& U4 J& Y6 o$ n1 x
2)文件夹下的文件名称无规律
/ [4 A; j( i- X0 i
: I' t3 Z4 w* e4 [4 g    如,文件夹里是n幅图像(.jpg) 和一些数据(其他类型),现在要读出所有的图像' ?( D! c# y! O5 {7 p+ m
# \5 I6 `" f4 V) {9 w
     a,先得到文件路径; c: l& S  A& ~4 V% h
        di = dir('文件路径*.jpg');( T& a6 c: r$ C# ]
     b,读入
4 w0 m3 G+ W0 }; a8 ~       for k= 1:length(di)$ K' I5 W& V; |7 m# C: j6 J  y
           I(k,:,: ) = imread(['文件路径',di(k).name]);
- E7 z+ r- h* [* I2 G       end5 S! K4 H1 q! M# u* c3 I( S7 q- B
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7 ~: U: V  k3 u' \& S0 A主程序:/ t( y$ K( J8 H# o7 l- _9 c
2 R4 @$ i; x& R4 x
4 b% \' Q! T6 b  g; e1 E2 G5 S: z

6 `& }7 |% y* jclc;
# w& _: {" i* `  Eclear;
' l+ W" y+ s/ p( i" M, B- S1 e0 Kfidin=fopen('title.txt','r');
0 G- u" c- @& P- W$ ]; P6 h) E8 z. C
$ w7 l  g' j1 t/ `( d: _& Gfidout=fopen('result.txt','w');
( k, [, M$ S. H6 \2 e3 H- Q0 s3 c- r& f! h3 H4 x" j
while ~feof(fidin)                  %while ~feof 表示 若 未读到文件末尾 则 继续 循环" Z6 P* l+ U6 V/ v* _# E
    wellname=fgetl(fidin);          %如果没有使用fgetl函数,则feof判断没有作用,这将是一个死循环!# S: `' Z& R; `& }. d
    titleline=strcat(wellname,'.txt');
' L! R4 d& D8 P# @1 V    [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(titleline);- H' S+ [% d1 s  O: ^5 l; U( B
    efc_rst=[efc_dpt,efc_poro,efc_perm,efc_ratio];
8 e4 Z0 Y: @# P+ H4 S* t0 L    fprintf(fidout,wellname);7 _" ~' K& t: L: ?7 t( f, p" ^
    %fprintf(fidout,'%s %s %s %sn',efc_rst);2 h8 V; ~7 v: c/ p: _! U& O( k
    fprintf(fidout,'%8.1f %6.2f %6.2f %6.4fn',efc_rst);
8 {: e$ T) o- t, Send
$ \+ b% x# i& Z: }9 m$ rfclose(fidin);# T, \: `% C! F$ Z+ w; |% ~& ]9 d
fclose(fidout);
+ M2 B/ i4 v$ z( u+ h; M( L1 q; U* u, ?3 p; _0 c
' z7 T3 o" ~" Q
( N3 _1 ^/ b$ ^. E
部分文件名(title.txt)
, }6 w) f3 E3 T+ K9 o
/ {3 N5 K  b2 Z* M: O, j5 U, OB12-B51-58' n$ n* ?/ t4 P8 g9 V
B12-B53-58
( u9 D4 |$ y  Q1 ]B12-B55-59
5 @7 L% w6 q; F3 Z6 K' cB12-B55-62/ C; @- a- L& B1 X7 G$ q% R' Y
B12-B55-64
+ o6 |$ w/ L* u; t9 AB12-B57-51
+ O2 g( Q7 q* U/ B8 I& CB14-B50-44
* j- X, f3 ~6 }7 @7 e& G2 yB14-B50-486 K' i, }% q8 @" u+ |/ X& N" Q
B14-B51-46$ R, O4 G3 F$ W$ R( g3 h7 m
B14-B52-49
7 h6 V" X- O7 J0 G, M: z; G" P, QB14-B54-48  w  D3 T1 U8 S+ q
B14-B54-53
' G. n2 w9 S; R  CB14-B54-74
. _& N& ~2 J7 P9 w8 x* ~B14-B55-52
% {. N, F8 d* @! `B14-B55-56
. l. T+ p1 T1 JB14-B55-609 o" B/ e( |- h% d) n
B14-B55-63
% J2 ^) _- w+ u1 _* @' _. L# b. K6 A- qB14-B55-65* c, U! L* Z' {6 p5 g; q2 w
B14-B55-67
1 a5 B1 |" N. J( v/ ~( v. u& I/ vB14-B55-69  E! S9 a0 c! j. t4 e( t- U
B14-B55-75
3 S4 m3 T* Z; S+ i* k: r. n1 MB14-B56-49
5 m' Q. l! u& _. q. ]# @  EB14-B56-539 m9 r  _) H# Z' _0 @2 e5 o1 Y' n
B14-B56-70' L* j( |  o' J! m% V% @

, E0 L' y. J- W# b& h- T5 p…………
9 Y1 f0 D$ S7 f7 E5 A  j
/ a# g  M' r* e$ Z! w* [
; g. D- L$ F4 B6 `$ {, k4 M
, g* c7 X1 _  U/ m, d' G7 Q; tfunction [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(file)$ M$ d8 x1 P% M, k8 H0 j% J* O. f
%读入数据,进行处理,输出结果
8 E- R( ]- ~9 }6 ]4 T    matdat=load(file);
8 p8 B% d4 y3 M7 S  j7 m8 I    [n,l]=size(matdat);; J8 v4 t8 e  c- q2 z
   6 _& U- J( `. \  ^
    efc_dpt=0;6 G+ {- L, i, |) w9 B/ e/ }
    efc_perm=0;1 @$ f% N2 v4 E0 I+ {" {4 C& |
    efc_poro=0;
+ ~# T2 M* G8 {. D; {& C: K    efc_ratio=0;
* @: Q: j7 K: N# R/ r3 o* o. B   
$ F7 j% h* F; G' X6 k7 i. B    for i=1:n-16 G* O2 ^9 R" l, M( t0 o4 s9 ]
        matdat(i,1)=matdat(i+1,1)-matdat(i,1);) b/ N5 s! r( z
    end
; S7 S$ V- T/ z& G  ?5 h' \% U   
! O9 r, Y4 r) [$ v4 F0 Z  \    for i=1:n-1
3 H  i0 Y. {4 u7 o/ }5 B        if matdat(i,3)==14 G. K- c' L2 i
            efc_dpt=efc_dpt+matdat(i,1);: X5 G6 d- k  I
            efc_perm=efc_perm+matdat(i,5)*matdat(i,1);
$ d7 B  z8 ~& [. r( B: f$ g! T# }            efc_poro=efc_poro+matdat(i,4)*matdat(i,1);% D7 \4 i- t7 a1 z- k% _
            if matdat(i,2)==0* }4 y; u' n6 Q6 `( \4 h; P
                efc_ratio=efc_ratio+matdat(i,1);  d0 l' }* N& o7 A
            end+ g. @# c; z) o
        end
0 m- z& l! i2 r+ V9 \5 h    end
! _& Z5 i% U- j* O  z+ }. y6 d    if efc_dpt==0
9 ]/ {4 R& Y2 X* u( y        efc_perm=0;* b- v* r' S1 j% s5 m
        efc_poro=0;
2 \4 p: n# t3 e9 E( {1 @        efc_ratio=0;
& N+ s5 P& y% z3 @' x- q/ P6 S, O7 ^. ~% S; ^; m' Z6 A
    else* Q% C/ q, \, Y) R# s1 b$ O
        efc_perm=efc_perm/efc_dpt;
5 }/ F: t! Z/ q+ e! @        efc_poro=efc_poro/efc_dpt;( u3 ?- `( \" S( @' k8 X
        efc_ratio=efc_ratio/efc_dpt;         t3 v5 G4 v2 y* l6 W2 O' Z
end* J; N% k) D* X; U# b, j* G

, D, z7 [. _: o8 H5 Z
  {: V' d( l! t0 O3 o, w
4 {  ]$ O, G' @井的数据
2 G, c& M4 H* f$ U
9 J$ e8 A& l5 i3 m+ B: v' K1865.2 3 0 0 0
" |" ?- h% }! K  s1867.8 0 1 6.8 0.1" t$ f' t+ \1 r! Y5 f# N( ~! e
1874.4 3 0 0 0
' D  d" o. J- O! E1885 1 1 3.3 0.02
; d% q6 W+ Q; d6 [6 i" J7 s& U1888.8 3 0 0 0
/ t' y- ^6 ~' |, A2 O1891.8 0 1 2.3 0.03! A- g0 s5 S9 d
1897 3 0 0 0! E9 j/ @/ h5 I1 k7 G; ^
1898 0 1 2.3 0.03
0 r7 R# K$ I' x* O+ y1903 3 0 0 0
" H6 c- A6 i: k6 r. O0 d6 H1906.2 0 1 2.3 0.03
& n) B; U% O) Y% `. F$ Z1911 3 0 0 0" f7 a' ~. u! \8 M+ R+ j
1914.6 1 1 3.4 0.21
% {: D. S* f. ^' o0 m( _, S- N1919 3 0 0 0# R9 ^' T$ B! {* F7 g
. P+ D9 g7 `( B, u7 K
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  t1 |$ d  E/ P; B) B2 j
% n9 w5 E4 [* x" Z  e( C  ?6 ]9 J
多数据文件批处理的一个技巧3 y9 M' e1 W+ x. O0 P! Y

2 ^' P# Q7 n% d6 c0 }0 E数据处理过程中,很多时候需要对大批的数据文件进行循环处理。如果文件名是有规律的,那么正常的方法尚可处理,但是碰到文件名没什么规律,或规律不强时,表示出这些文件按名就是一件很头疼的事了。假设现有以下文件需要进行循环处理,以供参考。
: L. H  ]8 `) ^1 `5 s7 H) e6 z6 f3 D2 c* s6 }8 I4 f- ~7 S
1、MATLAB
( h+ N& x; r9 A& K0 I  r  i/ Lclc;clear;
( _0 V& N; J6 ?, m%--将'e:/POP/data/'下的文件信息写入构架数组file_structure( B# B6 z7 L' U- l9 s
file_structure = dir('e:/POP/data/');
" u& @) s" K6 o6 }%--file_structure.name下是'e:/POP/data/'内的文件名4 t" _0 Q, R5 F  ]5 k& G+ s
for i=3:size(file_structure)      
! r  y! M+ m7 ]" z4 p4 {
, W& c0 S' R. }  P; @- S, l& z  filename = strcat('e:/POP/data/',file_structure(i).name)                 % stract 连接字符串
7 K) t. O; n7 d# `  f=netcdf(filename,'nowrite');  
# t9 d' j( i+ }% [1 m; N  a=['在此对f及里面的变量操作...']  
/ T" e$ b1 `; x. q8 d! @/ i. l& _: F  close(f)
7 G! h5 x. q/ U. e9 J8 L( `6 P0 z0 Pend
9 P# Y- g( ~9 q, A4 X0 L* m" Y  q2 C- f! |9 X
) K6 _* ~. _4 @
-----------------------------------------------------: K& L) _; X- @/ H
怎么用matlab读取多个数据文件?
' g, u$ E& y+ C0 B2 [9 t8 P3 L% }4 k! |  u8 a* f
7 V6 m5 I1 k3 c$ G8 w6 E
1:如果文件名规则
. N: m* m+ f' ]/ t; n3 V! w, {* K
/ F* B  c1 u' E! q! Q2 ^
% 文件目录:
2 Q' _5 S6 j  J; d& Y6 B9 j7 I' `' p. s- @

! e/ @7 B- V- P* r5 `" {my_dir=' /home/my_calculation1/test1/';" A8 G# y# B& E7 x
" ?8 |2 y0 p; ^1 B9 ~) A& N- H/ A
# J+ p; u: T! r: b

8 e) f$ |# k. [1 x9 |* O( a! ?4 t4 ~  E/ T& ?: ^/ d" ?! {
# Q1 V- R6 ?: \
%文件名前缀
8 ^, k3 r0 C) h+ U, n  d' Q* {' a7 V, o% C8 C. h; v3 g2 [2 D3 r
my_pre_T='test';
- I0 ~9 a' y# _%文件数目 fnum =1:32; %Read files for i=1:length(fnum) filename = [my_dir,prefix_T1 num2str(fnum(i))]; 然后dlmread,fopen等操作就不需详写了!与单个文件一样。& P4 |& K, W6 Z3 y
end
$ ]8 q: E; Y8 q) R
* [6 H- d) I: b7 A: G/ d' ~) A- c
' V. I  |! Q+ y& m$ v" S
! n" E4 f; X' ~/ c2 S5 @" @% v; U/ _+ Z) Z& c
$ O9 r( X; Y% d& i
2:文件夹数据批量读取的问题,命名无规则# }' q! ~, G* ?- E
在windows下很简单,ls函数便可以得到一个包含所有文件名的字符矩阵。可惜在unix下得到的是个字符行向量。当然,处理下也可以批量读取数据文件,不过不想再写了。因为另外一个函数也可以实现批量处理数据文件的功能。即dir函数( v1 U% U1 G0 l  N5 `: \! ]8 K& A

# C2 g0 C; R, r* A* N- P; rLS displays the results of the 'ls' command on UNIX. ' Z6 f  e# W" i
/ u1 R8 Q3 w9 ~$ R8 Z

$ k/ S! v& `3 f5 g% j
* e- ?, T7 D! ]On UNIX, LS returns acharacter row vectorof filenames separated by tab and space characters.- P! G# H: `+ I
) k, f) I8 [0 o3 ]* O8 a  A
! {9 l* v2 f' B. z) P$ {% E  b
& J2 P; z7 ^& B: `% s! H! ~4 f( M
3 [5 R3 J) W- D* i  {9 h, c
, [! t8 u3 y- l

, P( \) `8 C/ F; p. ]  O
4 n6 Z9 c+ Q& f7 h假定.dat文件在/home/my_calculation1/test1/ 文件夹下,文件名符合matlab变量名的命名规则,要读取第二列的浮点数字为数组并以文件名为变量名。
9 Q; G( t! _* U0 ]# q) t& ], i' W+ V# |5 G+ m

: n$ y9 w& f2 a# v
9 l: s3 J# t# b+ R$ umydir='/home/my_calculation1/test1/';
5 M5 H! H9 d' L; ~4 m, E7 W4 g6 t2 g. N
temp1=dir([mydir,'*.dat']);
  q+ d$ Z/ ?6 d1 y" G+ j: x
6 q' N6 k6 ^% z" S( s1 m0 k' ^) h/ O+ u" Z
! d* @, L& D7 {8 V. m. j6 b$ I. ?

  G3 d- k% b- M6 [- ptemp=dlmread(filename,'',0,1);
$ a9 ]+ }5 s9 U9 w' S3 z, f/ y( L  q0 O% f
* e" s; R: F# l5 {1 r/ v' H
) @. ]) C; j) Z9 G2 ~: [& D: H

' H, d1 z  \# S' e; k8 A! \- a- ~2 g* {/ [2 j
. J# l2 T8 B/ X/ V: d9 T* d$ Y# r
1、利用dir(外层文件夹)获取子文件夹;
0 {0 D8 F; |, @3 ?: K9 W' ]2、利用dir(子文件夹)获取子文件夹中的文件信息;
% Q# N; t: v: k' Q3、遍历文件,做处理;5 r' {6 A+ C* [# _* ^& h( z4 O
对于遍历文件夹,也可以使用mathworks网站上的函数dirr轻松搞定。
2 D+ @6 S, Y7 S4 x; l" ?  V( k7 y& p. A- q2 U; Z$ Z: B

/ u" i9 P) u2 l2 w' G! M1 }6 E3 a4 U, f: A' P" S
注意:如果直接使用 temp1=dir(mydir]);读取文件夹下所有文件,应当从第三个开始才是目录下的文件。 另外,使用dir还可以遍历一个文件夹下的所有子文件夹。; _1 P- ~9 V  W+ t
eval_r([temp1(i1).name(1:end-4),'=temp;'])
0 g$ E/ L# z- e! R( M0 o- y% A' q3 Y1 C" e. t
3 a- z+ M3 s2 Z5 r
dlmread,fopen等操作就不需详写了!与单个文件一样。
9 o, g5 K5 R6 wend
2 s2 {5 b  X3 a3 j7 e  X- h
9 W, [1 b5 F$ Y5 Q5 F6 [' x" _" {5 x$ w, d( \; u( u7 c

1 N% v0 _; J% ~, F& H8 V
2 |" `! `: e/ X+ {7 y% c% H' w6 g  }) U
, M0 z  S: V# T) T8 A
num_temp1=length(temp1);
$ Y% k! \, A9 s- [' A+ Y6 l8 L# u6 f0 q" @. ?3 o9 ~

2 b: D$ \* m! |; }9 o
. k8 t) n- ~" b* c6 \/ C
0 h& i9 t  B- v$ }* t, tfor i1=1:num_temp1
" l- n( u9 g/ O: z( j: f8 ^4 i8 S) f1 I- `) X. e& N( M. s. l
% G6 r7 ?" V; V9 d# D9 D& s& }
filename=[mydir,temp1(i1).name];% Z* q0 j5 Z) v/ r8 M9 x

" [. h) S$ u- P- \! A* @- q# m
) O2 L1 G+ P6 u4 y
" V. M8 U4 K& p2 i" g% q7 `/ O2 y* d1 T" A4 h' |

0 C0 p( |2 J% }/ h1 ~
, E( b5 d+ B! P8 W2 I( p) _# d5 w9 J0 O, J8 }- ]# D
" I7 s( E) K! \/ K6 k. e) ?
0 a# s( P7 l8 h' O9 j  {8 J3 U

. f/ k. M. y7 \$ F5 i
" z+ k5 q  S# Z( Q- V) N9 H; R现在有一个文件夹里面有50个的.dat文件.每个文件大概三万行.两列,第一列是字符串,第二列是浮点数字. 批量读取这个文件夹里的.dat文件的第二列。读取完以后的数组变量名就是.dat的文件名
& o" W7 v6 n/ O' W7 R2 {% w6 d$ ~0 n" x, W

6 e- P; z, H6 [8 }! B3 d- o% L8 ~7 {
On Windows, LS returns anm-by-n character array of filenames, where m is the number of filenames and n is the number of characters in the longest filename found. Filenames shorter than n characters are padded with space characters.1 V/ f, d: X# W4 p& Q
4 U) ~: R3 U% f# y
5 M/ ]2 Z; U) |" i, U
下面介绍下使用dir函数读取文件夹中文件的程序
" ?2 H+ ^' a2 b8 V/ Y5 ~9 S( c; V& R. }0 x- X# z* V0 y$ ~- v/ u9 A

; t$ s6 b5 v: q2.1 读取所有扩展名为.dat的数据文件,并进行处理。) u% V9 E! x' N+ c" Y

5 x6 e$ t! U7 p1 d6 Z
/ M' m# x1 T2 S+ ~5 M  X2 T; Vmatlab中,也可以使用通配符的。下面就来展示下:

该用户从未签到

2#
发表于 2020-3-17 17:50 | 只看该作者
这个方法不错。

该用户从未签到

3#
发表于 2020-3-18 18:23 | 只看该作者
matlab批量读入数据文件的方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 02:09 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表