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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
网上搜集的几个代码,很有用,保存。
5 D. [/ V% B8 r( j0 K  H) V5 p% p" R7 M
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
& V; A% ]6 L9 w* q6 G
& Z, D) z2 S! P% Z* Q3 m8 F1)要读入的文件下的文件名称依序列的方式命名,如a1b.mat, a2b.mat,...,ajb.mat,...0 G9 }2 H  n/ R& G. s1 i1 a$ Z
6 L( K% Y" U  o$ Z4 S$ C  G" B4 ^' O
   循环读入
( g& s1 ?0 J1 m' K9 J' X2 W1 e7 a2 c" B
   filepath='';%文件夹的路径- u% E. G/ r  o" a8 T# \& I

9 A+ b8 _  A* E! O3 h. t   for i=1:n  %n是要读入的文件的个数1 h: G6 H/ ^8 D: k: }8 r
1 ]  {' Q, q! w0 d9 |
       load([filepath 'a' num2str(i) 'b' '.mat'])- k# f1 w' L2 E2 G* |# m

+ e4 Z* t6 G: i, [2 o, K   end/ r) S4 f3 w& _0 P

$ x; ~7 O+ S8 P$ i& U5 V
& v& ]4 k4 U" d$ N7 K6 C
5 B0 v- O$ E. V& L+ o2)文件夹下的文件名称无规律. |7 s. L4 ?, L$ _0 h

+ W6 n/ S: Q, R4 B    如,文件夹里是n幅图像(.jpg) 和一些数据(其他类型),现在要读出所有的图像9 {, c0 _# K1 `

/ ^- X" j8 M0 y2 G( q% j- H; d! d/ N     a,先得到文件路径
! K  `" X, r7 D5 e& W  Q2 C/ b8 ^) h, t        di = dir('文件路径*.jpg');& Z/ z3 P+ X( n* n- H
     b,读入# m3 T+ p+ `& b8 c1 J. W
       for k= 1:length(di)* w& v" S6 J8 d+ A( \% p7 m
           I(k,:,: ) = imread(['文件路径',di(k).name]);# ^9 |5 a& f' W+ n8 l+ H
       end
: @; l, ~6 i$ v* [! Z7 Z0 o$ @+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++8 i! y1 V2 Y+ x1 u  M6 H
主程序:
. Y6 q* t% Z9 A5 C3 l
  b: {* T2 v* l/ t& t# G
* P: z+ g) B5 R" D, v! u5 B# Q/ q
+ _& q) P+ T3 @( T5 L  E6 cclc;7 }; s' \9 A* m) W2 z5 U4 _
clear;4 X9 _: A0 F" a# p  {% H0 s! h
fidin=fopen('title.txt','r');& W- y% Q! \6 p) K0 C2 w' o4 d' a- b

; G1 S* D) B/ W8 D0 l6 S4 B( Ffidout=fopen('result.txt','w');1 u/ p8 o2 ?. e

# B# |: c- Q# m- V( Ywhile ~feof(fidin)                  %while ~feof 表示 若 未读到文件末尾 则 继续 循环  D# ^& ~& l8 c7 Y
    wellname=fgetl(fidin);          %如果没有使用fgetl函数,则feof判断没有作用,这将是一个死循环!
! h3 g2 [" J& L  a4 j% ?+ }    titleline=strcat(wellname,'.txt');5 H3 t, d$ |8 Z4 ?
    [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(titleline);
7 e. G+ y& m* [% |; l' _' Q$ l    efc_rst=[efc_dpt,efc_poro,efc_perm,efc_ratio];
1 c! E8 |; @2 e; t7 D  o    fprintf(fidout,wellname);% D# Q. x' l* c! i0 ]
    %fprintf(fidout,'%s %s %s %sn',efc_rst);
# r- z* d! A" ~$ R. c& j1 O, }    fprintf(fidout,'%8.1f %6.2f %6.2f %6.4fn',efc_rst);
$ C6 W2 i7 D% u9 gend) Q+ O/ v% t4 k
fclose(fidin);- a$ r% |0 {( }- e. r5 m
fclose(fidout);, ]0 G9 F$ Z3 p6 m6 e

8 h  m1 S4 n& w- g
) f/ U) m5 X2 j( q3 k7 A( J/ ~. o8 m" q3 W5 C" U( ]% Z. w: d" Q
部分文件名(title.txt)
, @2 F! s3 P  ?  H
6 v" {+ {0 O/ W# f. [. W5 uB12-B51-58# o! h4 E. F/ A, ^8 y( T
B12-B53-58
0 }3 L6 z+ C* N/ ?6 G) QB12-B55-59
( X  @! y% `& n  N8 K1 eB12-B55-62
/ f* X  }& n: @" {B12-B55-64
6 l- m4 G3 ~' t+ nB12-B57-51
+ q  b; O6 Z% A0 WB14-B50-44
" c! p+ O4 C0 l+ P% e" m2 k& fB14-B50-48! M+ X1 `( }9 e
B14-B51-460 q2 V3 l) H+ t" S+ b" B
B14-B52-496 h/ e- O2 |9 c
B14-B54-48! Y! D9 I- ?/ g. p0 }7 Y
B14-B54-537 `; I5 j6 W" v  P- b
B14-B54-74; K* ], p4 h0 N* E; b; Q
B14-B55-52
3 w7 Z3 v2 C! l: q" f' l8 DB14-B55-56
' H$ G/ @: j7 OB14-B55-60
. N4 l4 h4 ^0 t! c. B$ TB14-B55-63
3 f# s6 \( w4 i2 }* H, ?B14-B55-65& S3 K; c' u6 B
B14-B55-67: D6 k% ^0 i$ S% B) p
B14-B55-69
- E( Q8 y, \: ]% v0 ~) ^. e5 [B14-B55-75( k! N% F  N" _0 [$ }
B14-B56-49+ I, a" m! H, V! o1 g
B14-B56-53
  o" u5 K4 v7 F/ R9 uB14-B56-70
- R+ o5 h- k, X, M" }4 V8 x2 S9 h" S: H$ T1 V( _1 r5 B
…………
2 z  M3 m: c$ w9 b6 B( W
8 o) c2 k; L' |/ _! C  N ! D3 y2 q% G/ x8 k
+ P2 |- e0 x& C
function [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(file)) I4 }$ Z, A1 H1 {
%读入数据,进行处理,输出结果
) D7 Y' p5 z9 ^9 E. [& S    matdat=load(file);1 @' O' A" W3 e
    [n,l]=size(matdat);' N( J; x& c3 ^7 G9 d$ O, L' P. W! F
   : [( O9 Z  b0 A4 I
    efc_dpt=0;0 ~. `8 X& V9 w, b! U
    efc_perm=0;
4 I. x" ?. _) U3 {    efc_poro=0;- U9 Y: T5 w+ a4 F  |
    efc_ratio=0;
' ^) k7 \4 T* N& g' z/ F0 I   3 @$ q; {8 V* C- S# A1 m4 a4 B
    for i=1:n-1
8 l  c# l3 K" N5 D8 @# x! `        matdat(i,1)=matdat(i+1,1)-matdat(i,1);$ F* ~  h0 m6 s7 {! G  {
    end
1 i3 h& g; v. E' j2 H& ?# r: Z   
6 r; f# o3 V8 x, _; L    for i=1:n-1/ C7 Y6 ~' b" M) e6 }, u5 O6 i. a
        if matdat(i,3)==1" ]3 F' v  I  C
            efc_dpt=efc_dpt+matdat(i,1);9 i( s, Z& v- t
            efc_perm=efc_perm+matdat(i,5)*matdat(i,1);
7 u7 y3 `  k& U$ t; E5 N1 E            efc_poro=efc_poro+matdat(i,4)*matdat(i,1);
- X2 I" i% g. y0 S            if matdat(i,2)==0
) a- s1 a* K6 ?  \3 x                efc_ratio=efc_ratio+matdat(i,1);
& E. X% B* w# A0 h# W            end
3 J8 B( j- U; e) r/ F+ L9 e# ?5 |7 n        end- X3 ^9 c7 P# ^/ _) V; G' n; B
    end
: [/ W7 C4 J$ c( n: _% w, ?1 ~    if efc_dpt==0+ k& E# Z+ ~* {* u% s" R6 [5 l
        efc_perm=0;
- Q9 u+ o* P' A' b8 W* `% a        efc_poro=0;3 ~: E* X& Z4 l# i4 f/ v
        efc_ratio=0;
5 [1 O% ~# d6 e# o  V$ j2 e4 j, x6 y" m
    else
6 a, k9 ]& D) C        efc_perm=efc_perm/efc_dpt;
* W" ~0 z+ i9 \* s, f5 x$ |        efc_poro=efc_poro/efc_dpt;- X4 b  k6 ^& Y7 T: T5 Y- F( a+ j
        efc_ratio=efc_ratio/efc_dpt;       ' ^# Y" |2 |7 Z: M1 B
end9 t6 i- y% M0 Y+ t# l7 N. D0 J( K

2 @% }8 A( U# c9 g& F2 y  c ! d* q0 G- T* z% d

/ I& c( |& x0 Q9 L* G" |& h井的数据( U. w4 a0 @* G) _

+ e; W' E9 b( v0 j  N1865.2 3 0 0 0
  C/ j% B) I2 g% d; {: a1867.8 0 1 6.8 0.1; c2 h& Y6 D& j+ |; c
1874.4 3 0 0 0. B% {2 r, \! z5 S
1885 1 1 3.3 0.02( c/ ~! v9 d2 c  `: g
1888.8 3 0 0 0( ~6 A+ N) A* G' v% h8 D7 d
1891.8 0 1 2.3 0.03
) u  v1 G" a/ b7 L& @1897 3 0 0 0
: W3 y8 F# `% K4 G# S/ F' n' Z1898 0 1 2.3 0.03
4 F6 f/ ]3 Z4 u- l1903 3 0 0 0
, o1 R/ a7 k, s2 ]1906.2 0 1 2.3 0.03
  |0 ]) A9 ~) l( L) {% ]1911 3 0 0 0
1 ?! L* _& A) k- a# D* W  v  o1914.6 1 1 3.4 0.21. G! }5 Y3 Q7 `3 p
1919 3 0 0 04 C9 m/ b# }+ ]- h# k- I% x
6 l+ r. B0 @& F! g
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2 w/ q0 ^! ^* D$ |0 a+ H2 h1 R
) R& r+ Y- X* R
多数据文件批处理的一个技巧9 V( q9 |' v5 h

7 ?$ Y  J0 J( ?* Z+ {数据处理过程中,很多时候需要对大批的数据文件进行循环处理。如果文件名是有规律的,那么正常的方法尚可处理,但是碰到文件名没什么规律,或规律不强时,表示出这些文件按名就是一件很头疼的事了。假设现有以下文件需要进行循环处理,以供参考。
6 D! u" y. b& K. q! S( B! O
3 D$ f, g. s/ V. c: P. A. B  ~' F* U1、MATLAB 7 ?$ h- i. Z8 c+ u, ]
clc;clear;
# C" W! L" T+ ^- p2 s; Z) w" ]%--将'e:/POP/data/'下的文件信息写入构架数组file_structure( n) ]! @7 P# e2 q" {
file_structure = dir('e:/POP/data/');
- ~/ ^5 j8 M$ `- L%--file_structure.name下是'e:/POP/data/'内的文件名  _# _5 @) ~) v' Z/ B- P
for i=3:size(file_structure)      
4 u1 q! e4 J) O" w3 f; a: k. z5 W* E# y* O$ v. p1 [7 |
  filename = strcat('e:/POP/data/',file_structure(i).name)                 % stract 连接字符串) g1 }" y! l( O  u( B2 Q
  f=netcdf(filename,'nowrite');  . D8 k2 g8 N$ O' h( H6 i4 U
  a=['在此对f及里面的变量操作...']  % K  E: t6 X1 p3 w' t" W
  close(f)
) z" a) m8 {" ^6 r, I5 ~1 o& send
( b) z; D7 c$ G# t4 C2 c- V& _' y: n# t( ]0 l

! h6 D' U& F# B& q8 \: o -----------------------------------------------------* z6 m! z  n$ i  n% ~
怎么用matlab读取多个数据文件?  z0 H) V' r8 |! r
: {2 m, \3 P) W6 |3 X4 G3 l2 x

( T: w: C1 N) r9 t, C) d$ {2 k3 h1:如果文件名规则
0 O7 s" G9 _6 A  p8 J- o, R2 v( X/ d) q% Q" ^/ ~) ~, z
% `( t2 B( g" x/ Q9 |2 E) C* u" b
% 文件目录:
' s, l+ P/ I# }" C: F) j; D
$ q# V- B: g) a' I) x: F2 v
, s. {& Y. W4 ^2 M9 Y! W: jmy_dir=' /home/my_calculation1/test1/';
1 R* X! G* h+ U/ L1 @% ?8 @, a3 ]! e7 V. h0 |4 C) j/ Y, s
8 T9 Z. W  T$ m, _0 `$ Z+ T" r- E

0 {6 x! R: w1 s# K+ G9 U& B6 N  O: J; ?0 i4 F/ o

& U& o+ I* R7 W  s/ }# M! _* k) R: c%文件名前缀
1 m# u% W% r( p' ^1 P
. a6 _% O* F8 j% Nmy_pre_T='test';- l7 J# g5 R! r
%文件数目 fnum =1:32; %Read files for i=1:length(fnum) filename = [my_dir,prefix_T1 num2str(fnum(i))]; 然后dlmread,fopen等操作就不需详写了!与单个文件一样。
7 I. K0 ^3 m3 j; rend
1 w. Y, |1 R# l% H3 Y7 L/ I3 ?! B& M; |  Q; h
6 G! k; E& O  P$ _
& ]; _/ x1 e/ ~5 G. O
+ w0 l# @2 ~9 o' ?* y
' t7 ~. ^% W5 e+ O# v
2:文件夹数据批量读取的问题,命名无规则5 C- h- O! a) G. @3 L% E& s
在windows下很简单,ls函数便可以得到一个包含所有文件名的字符矩阵。可惜在unix下得到的是个字符行向量。当然,处理下也可以批量读取数据文件,不过不想再写了。因为另外一个函数也可以实现批量处理数据文件的功能。即dir函数
. o* T" j9 e- z, }% }4 m: r) x' d+ w0 i2 e# T) S9 H
LS displays the results of the 'ls' command on UNIX.
8 Y+ Z6 C$ m: r+ A: H6 m& v4 j. O+ V: B3 l% Q; |" }4 ^' G" {6 U

& X" H# b  A3 B4 ^! X/ _8 G
$ r$ q: q5 r; A; R! L' t1 o6 d4 u+ }  AOn UNIX, LS returns acharacter row vectorof filenames separated by tab and space characters.
) f; J# S  F! u1 v) E2 J# \
! @+ G1 r2 F: S! S6 U/ R) q+ X3 Y8 Y4 U: W: @

9 Y3 E1 F1 S0 U2 q% G' Y# v" S* j7 B3 _" s! M8 Q; O
6 S! Z; I8 f6 p2 ?

- b, T4 L' U* V, }$ v- |* M$ Z& s. B% P8 U. a! N
假定.dat文件在/home/my_calculation1/test1/ 文件夹下,文件名符合matlab变量名的命名规则,要读取第二列的浮点数字为数组并以文件名为变量名。, q7 w0 z  J# r2 u8 |# @7 [

5 T+ @$ c  J& q7 c* c! `. G( ], C% {" ~3 e& M# k4 k3 G
1 R4 U# r( A; T
mydir='/home/my_calculation1/test1/';
: o, o3 p" Z7 {* v# d/ X7 B- c5 k4 Y: Y0 S9 t+ z/ Z
temp1=dir([mydir,'*.dat']);1 F7 a3 T& \( m$ X( y; b! H

! E. G$ O: \  `- q" v" U7 X/ n+ p( x6 a6 V4 l
0 w  l7 z4 Y  w5 v; W. y' k
0 @2 K! @: t6 z$ g
temp=dlmread(filename,'',0,1);
1 O3 Z) G7 ~$ ]. G) v- _  ]9 Q2 i$ O4 e" d) J% N

/ v/ S! {5 ?9 y
4 P) t+ S2 q2 H9 D( M% j
! S6 B& u. I* [9 N1 C% `1 z6 U2 ?" _& e* _7 m/ ]
0 E+ E; k; M7 K* B  Z9 _1 s
1、利用dir(外层文件夹)获取子文件夹;
" T  Z, o/ G$ Q2、利用dir(子文件夹)获取子文件夹中的文件信息;
7 N" p2 |/ ~4 w; g3、遍历文件,做处理;2 H. I) C0 n& p8 G/ S  }
对于遍历文件夹,也可以使用mathworks网站上的函数dirr轻松搞定。
) g  @7 o. g! s2 d6 ^& w
; e* Z6 }$ r4 x- u1 I) M
8 f( @5 [6 Q; W% h, K% B+ b' {8 q& @$ t4 o3 S5 k3 k  G
注意:如果直接使用 temp1=dir(mydir]);读取文件夹下所有文件,应当从第三个开始才是目录下的文件。 另外,使用dir还可以遍历一个文件夹下的所有子文件夹。
3 V: b# t; Y. |3 j+ I" meval_r([temp1(i1).name(1:end-4),'=temp;'])& H8 {# {2 ?0 `& ~* U
. c( s+ n7 U5 C4 _+ S( |! H
% }) f) s$ E& h5 c9 A2 L! ~
dlmread,fopen等操作就不需详写了!与单个文件一样。- S& R$ s1 A; y2 U; ]
end
$ d+ S8 U  N9 }$ v2 I8 D1 i; g3 y* z5 g; S
7 e1 C7 _8 @+ l1 l+ E# K& q. V# W
8 V; a5 P+ E4 ?+ U

/ ?% J# i" y+ f( j1 f- h
; N8 D! ~* T$ e: N1 c, P4 Q7 o) H, V/ |' Q; V& O; _
num_temp1=length(temp1);+ E+ Z4 U" }1 M7 @8 X

$ m' U+ p1 M) X$ Y( x) v/ J' F+ U/ V. M2 g# G7 `) w- j' F; ]; V
4 ]$ H7 w& y+ K' w. b
( D* F* o7 `. p
for i1=1:num_temp1( j. m- A$ B, |9 f

1 B- d( N% {8 H3 V; e. m/ Y5 a3 v1 I5 @8 Q
filename=[mydir,temp1(i1).name];
% u, ]# ^3 L0 ?9 f  }6 I3 r- @' ?) }1 D" `* Z0 p4 q2 o' g
. s( i$ q3 C7 I; I9 T* u

- X& b4 G$ @) A3 n! H! j" b. T1 D$ D0 D" C) u8 R+ ^4 S% F8 M
+ x: d0 a8 y$ |6 ?' b  y
/ I: s8 O3 C- l) c* B
% D4 I0 @: _9 z1 n

8 K! M  v" F6 \7 w/ @# }& @
- {; _. y# }7 u3 T' H. Z& S! _$ v6 }) j0 b8 O; u
9 A3 k  D! O. B; ?
现在有一个文件夹里面有50个的.dat文件.每个文件大概三万行.两列,第一列是字符串,第二列是浮点数字. 批量读取这个文件夹里的.dat文件的第二列。读取完以后的数组变量名就是.dat的文件名( f! ?$ Y; M' Z7 I

: W* \  r2 E, H0 |) \1 w  w) K- E5 U0 o) b: V  `

8 W" \: Z% L, G" c. YOn 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.0 u' l, M2 V! @% \

4 D3 O" v% }6 L  U% Q7 ~1 D4 K4 y) s* a* ^+ p- e
下面介绍下使用dir函数读取文件夹中文件的程序
/ z4 F& r: u& k1 ^- l. R2 a4 w/ B5 B9 c" x+ r9 @& |
8 q: E0 e, s' w" z5 c
2.1 读取所有扩展名为.dat的数据文件,并进行处理。2 z- `0 n; i& C+ Y# r; w
- H) t9 r: ^# I- G  o* J, h! w
: D. b( g4 p2 N+ Z& y
matlab中,也可以使用通配符的。下面就来展示下:

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 00:45 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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