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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
网上搜集的几个代码,很有用,保存。7 G7 I' g, _# _  m

0 b  l/ _5 g" r0 ~++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
. Q2 P1 Z# q: _8 G. ~$ u( v; T
; Y' `3 m4 D# {2 \* m1)要读入的文件下的文件名称依序列的方式命名,如a1b.mat, a2b.mat,...,ajb.mat,...! h4 ~& S: Q, ^% k2 S. j

9 }  u, g- x* Q2 U" s   循环读入" s) x  U4 G* K2 k/ L' A4 R

7 K  |$ D/ z7 H+ @9 r8 ~   filepath='';%文件夹的路径$ [  b. f3 j, i7 b
# Y9 g, \- O) j% D
   for i=1:n  %n是要读入的文件的个数
% H# S5 v9 h7 B$ }8 q4 _6 v1 v7 l. ]# i( v) ~" l
       load([filepath 'a' num2str(i) 'b' '.mat'])0 E/ G8 p9 K7 Q8 H" G4 V4 K# S
; O' m( P& r: {' u, I) U$ r8 Q
   end
* Z/ R. x  E( P' M% m- H$ ]5 ]  o
& W6 e3 O! m4 D! ?5 y# {6 S% F" l! u
' }+ B: C5 [$ |
2)文件夹下的文件名称无规律
2 |! C* K& V8 i! M% k
; x, g1 `  c/ u. F) c$ s    如,文件夹里是n幅图像(.jpg) 和一些数据(其他类型),现在要读出所有的图像* ~* E( z* \1 |' Y' Z! s
1 z5 j1 h5 ~) w. c; T
     a,先得到文件路径: L2 g1 S! P! o+ d8 r
        di = dir('文件路径*.jpg');# g) w5 d5 e; n% Q
     b,读入+ i# {9 F: R9 V, L. m; q2 W) _
       for k= 1:length(di)7 c7 n1 g: |9 A8 W
           I(k,:,: ) = imread(['文件路径',di(k).name]);- Z+ J+ e7 z( p' u% q# L
       end
/ [6 |2 \# K1 p5 v: F+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++4 p8 Q' ~" Y7 g7 ?
主程序:
9 }: l9 c' c: |6 X3 G: H9 ]  \
9 g  z% _5 @: N5 X( Q
3 J$ N. \3 Z( [6 H4 }. o, c6 J7 \4 U
clc;
. `& K: y$ N/ h- D8 D% P4 `clear;
/ i7 Q: z9 j" n1 Y! N& B# P1 Ifidin=fopen('title.txt','r');  v# e* n0 v0 ^8 j
: g* t2 P* G0 M9 N! K+ }; J7 w
fidout=fopen('result.txt','w');# F+ C9 r/ G: D2 x: V% u' D6 r

- P- C' s  Y8 h( Iwhile ~feof(fidin)                  %while ~feof 表示 若 未读到文件末尾 则 继续 循环$ r( p2 I- V' k* j  g4 P
    wellname=fgetl(fidin);          %如果没有使用fgetl函数,则feof判断没有作用,这将是一个死循环!8 I8 ]5 k* t: b$ T& s+ E6 z6 ?
    titleline=strcat(wellname,'.txt');/ L& f- Y: {( P$ c
    [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(titleline);5 {: P9 u  R6 r2 N% ?
    efc_rst=[efc_dpt,efc_poro,efc_perm,efc_ratio];' b# E$ [! q8 g3 Q: h
    fprintf(fidout,wellname);
% x& t- P6 r) Y+ ]0 \4 c/ ^+ Q    %fprintf(fidout,'%s %s %s %sn',efc_rst);
$ [) q' X- j- O' H: j( r; W# d    fprintf(fidout,'%8.1f %6.2f %6.2f %6.4fn',efc_rst);
( A( ^' \/ Q8 h# A9 jend! h; e+ f3 C! _/ t
fclose(fidin);
3 }1 @2 T1 O; D+ v9 J: ~0 B. Qfclose(fidout);
- Q/ h: Y/ x1 `
8 O! [5 k3 s$ H: _8 I- f3 \, _# m
3 o/ Q7 j% E# i# D! Y: \
% x( X( d! S- @  w. i2 F/ g部分文件名(title.txt)0 Y* U. A4 [  `/ q5 [! F

& d% ]* r8 T9 I9 s. P. VB12-B51-58  T8 Y' Y4 |! k& j" y
B12-B53-58$ z/ a7 L: q. M; Z1 m" w. u
B12-B55-59: O8 O- H/ b5 N7 |' ~: Q  N
B12-B55-62
0 ?" |; }$ J' W7 e3 QB12-B55-64
0 ?2 H! _% f# Q2 RB12-B57-51/ K) Z! h, K/ F+ b, M* r: `! y
B14-B50-44
5 t- n6 X/ t6 A: \% J" C! j3 @: iB14-B50-48: J7 x7 N+ g2 T
B14-B51-46
+ J$ A5 s& U& h0 _B14-B52-49
% n: y" b4 l# _5 tB14-B54-48
+ i5 v- h# m( d2 _, s  m6 N% oB14-B54-53" p2 p% N/ K0 n4 M" s% r# F
B14-B54-744 C0 J9 z* X7 X9 c2 G) f9 S
B14-B55-525 Y/ l" X* ^* J0 o( p
B14-B55-56& m( m2 l& `8 E: k
B14-B55-60
) [) [! R, N( |B14-B55-63
6 u. v- y8 `1 N2 e2 xB14-B55-65
: k$ i' V2 ~/ x3 j& `B14-B55-67
; e- O0 ^1 G* b6 v( k$ z9 GB14-B55-69, U' U& N/ v. {$ j, I2 z: {
B14-B55-75" Y, V% o; B8 m
B14-B56-49- p$ ]9 S" S, i8 ]1 l- d, @% b2 V
B14-B56-53
0 ^- u; Y, L  }: o$ k, B  tB14-B56-70. e. G6 L4 O$ R1 X
9 D9 j/ V5 u6 M( i! o
…………* a. ?6 g, w# q- X/ A! j) @
: ~9 ~+ A0 L* T
5 p# s4 ?% n3 t- j$ u2 G2 }: R

8 ~8 a3 g9 K, I- v0 a. j; g# J$ N/ ]function [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(file)
6 U; y' F7 K8 I8 `* O%读入数据,进行处理,输出结果- o5 p3 [, u& o6 a$ [; U
    matdat=load(file);
3 k% ?5 v& T7 f& _" _8 ?0 ]- D1 h    [n,l]=size(matdat);
% q! b/ F0 o/ W2 p     [) Q# h+ S/ _
    efc_dpt=0;& C5 M0 J% o6 S  U# ?9 S8 u
    efc_perm=0;
  R, `2 ~4 H- K7 D0 t$ I' I    efc_poro=0;
" \% \! [3 I8 K5 ?    efc_ratio=0;
4 M8 D* q/ r( b   / ]) F! n+ f& N- Y1 |! H4 }3 T
    for i=1:n-1
+ D/ q9 ~, \) H2 x" b4 j        matdat(i,1)=matdat(i+1,1)-matdat(i,1);
; `0 U8 l  G% T+ D    end4 g: q' x$ {6 t2 x8 B' E& X) t
   
6 s0 G" H, S& d  J8 w    for i=1:n-1* q! L: t& n# B, E9 x9 @
        if matdat(i,3)==1
# s  W- k' {2 ?            efc_dpt=efc_dpt+matdat(i,1);5 M1 `0 _* H( n. g" K+ ?" e6 T6 X
            efc_perm=efc_perm+matdat(i,5)*matdat(i,1);' l+ p. z7 @  Q( U( q7 ^
            efc_poro=efc_poro+matdat(i,4)*matdat(i,1);# W* T/ `6 Q" j: l7 i
            if matdat(i,2)==0
; u9 ]$ ]9 J: X: x5 v2 b8 C                efc_ratio=efc_ratio+matdat(i,1);
% m+ H! K% Q7 N: [6 M  ~: o            end
4 T! c) i1 f" F  H+ W) p        end
  ^% C2 W) s+ f2 r$ K: K8 z" p3 O    end2 e; J; u1 u. V
    if efc_dpt==0
* U, @# A. M3 y( u        efc_perm=0;
. a- A0 J7 ]+ Q9 q3 p5 b. T        efc_poro=0;- z2 H8 S7 v4 M
        efc_ratio=0;+ O' T! J6 y* m) ]* \' M5 _
5 o) ?' H; i6 [! ?4 j! D) U
    else: A- Z' }9 p" a6 r4 @6 J
        efc_perm=efc_perm/efc_dpt;
/ r3 v9 S, l+ x        efc_poro=efc_poro/efc_dpt;
4 x2 b5 p, x$ T- K        efc_ratio=efc_ratio/efc_dpt;       9 Y! k( {, I9 k6 K6 ~5 }# H
end0 M* L- }; t3 C2 \4 c

3 p) Y% P- Y" [2 o# Z % ], d5 \" \; N" R. p  ], x
0 q, n% _1 b$ G5 ~$ \
井的数据0 J! ~' @7 ?  e) V) s' e+ P: Y4 b. Z

/ c: ~2 S" m1 z, h# n8 |" a- L+ }1865.2 3 0 0 0
' A. C% E% d+ e7 A4 W1867.8 0 1 6.8 0.1
$ o) e2 A/ [% c1 z: p! A1874.4 3 0 0 0: X# A& G9 q- U2 B2 N( T! O
1885 1 1 3.3 0.023 e* i! g8 |: d/ A$ ^
1888.8 3 0 0 0! P6 m( V" M; v: W) _5 F
1891.8 0 1 2.3 0.03
% o8 \! g8 o" ?! g1897 3 0 0 0
* W+ l: `7 Q3 \5 d  `9 Y1898 0 1 2.3 0.03
( C: l8 l3 z$ D- h. {$ M, s1903 3 0 0 0
! N) r4 J( K( Y: N( N* r5 d: O1906.2 0 1 2.3 0.036 {$ l- A/ ?7 O9 @
1911 3 0 0 0( G9 Z' k: N: ^& `
1914.6 1 1 3.4 0.21
) Q- r! X5 f( i$ n4 ]1919 3 0 0 07 f! b5 q2 B8 a' c5 c1 ]! m( g

5 G) y+ l$ o0 X* \6 T* S/ M+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
& K  z0 N4 u/ K: y3 J$ q3 g7 q) E; S# v$ v# h# g% M/ }
多数据文件批处理的一个技巧( F# ~# C6 l; B/ `

$ b. J& w2 c) A6 f- I/ Q6 e$ _& Q数据处理过程中,很多时候需要对大批的数据文件进行循环处理。如果文件名是有规律的,那么正常的方法尚可处理,但是碰到文件名没什么规律,或规律不强时,表示出这些文件按名就是一件很头疼的事了。假设现有以下文件需要进行循环处理,以供参考。: o% F% A  Q" {" B/ j; B

) [1 P3 ^( x6 V; `7 `1、MATLAB 3 g) g& c; L2 V, r5 j' O* J9 \$ ~
clc;clear;
1 G/ h/ ]4 w8 B; ?# I%--将'e:/POP/data/'下的文件信息写入构架数组file_structure
9 ]( q; S, F/ U% V: L; _file_structure = dir('e:/POP/data/');
2 ]" P" H4 R% \5 Z2 a%--file_structure.name下是'e:/POP/data/'内的文件名
" J: P. O6 X! D  E9 K0 tfor i=3:size(file_structure)      , O' `2 H9 Q+ R
+ l+ y& M3 p! b. D$ b. K
  filename = strcat('e:/POP/data/',file_structure(i).name)                 % stract 连接字符串
2 l! e' m8 I, U/ [  i, }1 X+ a  f=netcdf(filename,'nowrite');  ) ^! C& X+ u4 _( ?+ x! z
  a=['在此对f及里面的变量操作...']  $ O" k9 W& v: K7 \. E& p
  close(f)/ p" B+ B( x7 P8 Q! E
end; N! ]2 L7 z8 R* ~

3 e% Y- Q$ v& F5 [3 N0 }
2 b4 m7 o$ S: ]) x" _; E -----------------------------------------------------
  y2 d, \" g1 j; b3 b怎么用matlab读取多个数据文件?
% C/ d. d! J, P4 W  s
7 I: |. z1 O# x
' R9 l" z- Q6 I4 g3 R1:如果文件名规则5 q( x2 e+ B( u5 M2 X1 k( P8 }

" {9 {* a: p6 @, ~5 o: w- b
$ \+ v1 h+ L/ l& X5 i% 文件目录:
: s6 g, ^3 t! A6 ~4 n* S
; {) n5 K  |: x7 E- M$ s
( _5 c& [' T1 Lmy_dir=' /home/my_calculation1/test1/';# o7 _% l+ ]% N' W' x

  {2 P- t, z- v2 ?% s$ \. Q  n3 E' J' H
9 u+ g3 W. N) _4 |8 h3 }
6 c! w- T' j9 f' W+ ~7 u1 x( ?
4 ?0 G2 \2 R% T) b& A; s3 w; l) U/ _
%文件名前缀
$ E) H8 N+ I% b1 V# T( F/ |
# u) {% {  M6 p& G. x% {  Xmy_pre_T='test';/ ?5 ~0 N7 ]6 t# i% h! v# \! V" ?
%文件数目 fnum =1:32; %Read files for i=1:length(fnum) filename = [my_dir,prefix_T1 num2str(fnum(i))]; 然后dlmread,fopen等操作就不需详写了!与单个文件一样。
4 I! \2 \. K" |2 F; j) N+ a6 O8 Z: eend
  P5 M( \/ H5 y" J1 Y, D3 G" ~6 h: M1 s8 G) i- N- V
. ~3 e- Q- p( G# p+ m6 V
5 ?/ `6 ~8 {. L" h4 }7 R

3 M. R) k* i" m& z# j, w
+ S. T/ q' H6 S+ P2 Q$ D2:文件夹数据批量读取的问题,命名无规则  Z8 f+ p/ U0 Q0 i8 c
在windows下很简单,ls函数便可以得到一个包含所有文件名的字符矩阵。可惜在unix下得到的是个字符行向量。当然,处理下也可以批量读取数据文件,不过不想再写了。因为另外一个函数也可以实现批量处理数据文件的功能。即dir函数3 y" _* P5 d, L8 r7 R) N

) i. B. J6 D- c. n1 z1 ~LS displays the results of the 'ls' command on UNIX. . E* h8 `- f, m) w4 Z6 |3 h5 ?6 B
5 P7 X. V+ _3 ?" f4 D. V

# @1 j8 O2 C% ?$ m: y+ w7 p4 M1 R! w/ f$ ?
On UNIX, LS returns acharacter row vectorof filenames separated by tab and space characters.9 D& Q! g, j$ y. Q5 W: i

9 |; z7 s( a+ P5 E1 D* J' q' i( F% a$ X, B5 S; @* p

3 G. u0 _0 B6 I+ X6 W5 q4 q+ ?# E( J9 Z3 b' B' T

, J8 S! J6 E' L9 @
+ S+ I3 y5 w1 n2 F8 O- l7 V9 Y. L7 F% E8 r0 a- R* T
假定.dat文件在/home/my_calculation1/test1/ 文件夹下,文件名符合matlab变量名的命名规则,要读取第二列的浮点数字为数组并以文件名为变量名。0 q: T) G0 w/ Y: _9 M" S) n. _

. D+ y) E' g( \
8 o; X$ D$ o4 ^* }* t" D
6 N- }/ x( v% l# D7 Q4 ]mydir='/home/my_calculation1/test1/';4 i& O8 B% Z2 |: \# H- F

2 a# l6 H. {* W5 C3 I( ]8 H0 R7 ntemp1=dir([mydir,'*.dat']);
5 m; P2 e4 u6 V) O. Y6 y" t; u' z
: b. M* S% t6 d! \0 N: E
  J7 q. D7 O  L* h
- q- W, ~, t; D
temp=dlmread(filename,'',0,1);, d# j5 g& L. g) C! n
$ y. s9 s: l' G3 q
$ o4 q; t$ @" w7 ^& e" r3 R* b2 g

- b% f7 v7 O, {3 r. z% C4 o  q7 e' a$ S  v3 x3 F* c$ y. C

* B, v2 u& v; b% A3 e0 P& X  e4 G& d+ {9 ?  I3 P+ n# a7 s
1、利用dir(外层文件夹)获取子文件夹;
7 f9 b  N3 O+ g2、利用dir(子文件夹)获取子文件夹中的文件信息;* z# |( C5 W' e+ k; y
3、遍历文件,做处理;7 m4 O3 L, e; H6 \2 i, \. s# b
对于遍历文件夹,也可以使用mathworks网站上的函数dirr轻松搞定。
* p. \& ?: G  B9 t- `- ^& u# K) ?; }; j
; }' ?- t$ Q+ q& n* C$ O7 g, c7 Y2 l4 L
. W& k+ H& T1 K% F4 Y- n
注意:如果直接使用 temp1=dir(mydir]);读取文件夹下所有文件,应当从第三个开始才是目录下的文件。 另外,使用dir还可以遍历一个文件夹下的所有子文件夹。
  J$ E4 V, M2 A# `; peval_r([temp1(i1).name(1:end-4),'=temp;'])( j5 ^) [; L, z' m# X) v

! a% X- w4 n$ i6 h# ]: R( q$ F+ u
dlmread,fopen等操作就不需详写了!与单个文件一样。
( J+ e, Y1 _- j5 t7 q2 ?' j/ xend
1 U& |4 C) h; E, ]) V8 e5 c  @. g. v/ C  M1 Z
& c& S" E5 m" c  y3 K7 W2 g+ R
7 D8 r3 \4 e4 z$ v2 S0 a, L% w

; C' v3 o. s' W9 c* O" m* V/ q. T6 @- Y3 B7 u

, t0 G. c2 w( V# L) a) {+ H5 n9 Jnum_temp1=length(temp1);
; M; g  v* z9 }( {: I6 g3 I/ U$ v" c! F
$ n) \% m$ U: x

. D2 ?; ~, d  F) ~* |. s; s' N
; V$ h: P+ V! kfor i1=1:num_temp1
' O* g6 B: [2 M( Y, K+ e1 v" u. s8 N5 k+ X) n- a# Z! r

6 ~( P/ J" h6 afilename=[mydir,temp1(i1).name];& B9 k+ s& L& }; C5 F1 `5 e3 {7 N

' n; v5 f# c9 A8 C, R6 t& M/ \2 L1 J+ Y& `# Y) v9 W
' o; X/ i, B: b) M- b

' b2 V) r4 j- H& e) x& q8 z" l
8 ~8 s. ~7 g7 X" X% c2 f3 V- G  L4 l' h6 @( @2 f
" m7 |+ B' B; p; [
8 q" c; O' E; D8 P8 z

  w. C6 _& p+ \. B
' ~1 B: J5 t% n+ m+ e+ t2 U9 V( h2 ^4 {
- V8 h' ?, q% J3 q  z7 m( j现在有一个文件夹里面有50个的.dat文件.每个文件大概三万行.两列,第一列是字符串,第二列是浮点数字. 批量读取这个文件夹里的.dat文件的第二列。读取完以后的数组变量名就是.dat的文件名
4 B6 t1 z% n3 M' D- e  ]3 v, R
. }; m2 T4 h# {( b. F% q) _% t) X* V8 e. g$ E" m  X4 G
% K: J& z0 Q5 b+ [2 y& p$ C
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.
, V) H( Q. g' @& p* j  I1 @' B# l
; O# `5 P& x# d1 Q9 }9 b6 s3 q1 d: X8 }% y7 M
下面介绍下使用dir函数读取文件夹中文件的程序
% ~9 D- |  d) O5 G1 \# T" X1 H& j- X+ l. S' s
& j! E+ ?5 v, w. M8 S* l* @$ D
2.1 读取所有扩展名为.dat的数据文件,并进行处理。
7 j1 N2 L! c3 X& N# R$ ?; n# R9 V6 P6 H; r
' Z3 H" k$ v. h3 o
matlab中,也可以使用通配符的。下面就来展示下:

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-20 19:50 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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