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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
网上搜集的几个代码,很有用,保存。
& P* s* D6 ~  N! o) n8 I) G7 J: O2 W8 J# x3 r
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% s- z% x! `; R$ U! u7 a# A0 h; X1 O0 ?  y
1)要读入的文件下的文件名称依序列的方式命名,如a1b.mat, a2b.mat,...,ajb.mat,...
( `% v( m% S  [% n4 V# I$ t: Q+ h/ a% F! E. u
   循环读入
+ H' j- n7 X0 n& Y
9 x1 d, }, y8 v" s7 |# D' e4 W$ k   filepath='';%文件夹的路径+ Q8 P, {% B' r  D! s

" l. H: Q. t* E   for i=1:n  %n是要读入的文件的个数
" h& Q* r+ Y1 Y0 ~8 U: Q. a0 E1 X8 S/ X" Q5 A: y
       load([filepath 'a' num2str(i) 'b' '.mat'])+ z$ R9 ~1 c" h( F+ o$ N
4 c' `* a( t; f
   end
% d! `& C" ]. D  \
9 L2 N- |$ \& \7 i* v: e & |$ @+ S! L6 D. }0 C! ^

! J; O4 U7 ~# c' l" j2)文件夹下的文件名称无规律1 |; n6 J; F% l8 T2 ^6 P

  k' s! i0 o' w+ Q( K    如,文件夹里是n幅图像(.jpg) 和一些数据(其他类型),现在要读出所有的图像
2 i3 ^4 G/ f" X. I5 R3 ^9 k1 y" ]( W3 k
     a,先得到文件路径
1 D! V# X1 T% i9 p* l& V. @        di = dir('文件路径*.jpg');
: {/ N% ~/ `) \1 z; A! c' A. t7 R     b,读入9 e! T. d! e  t
       for k= 1:length(di)
, G' n  {" B0 v           I(k,:,: ) = imread(['文件路径',di(k).name]);
& j4 C* q) [' W1 N+ M5 {       end( T6 B2 F6 y5 x5 T% H/ w
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* o4 b1 ?6 g0 }5 s+ l' C主程序:- ?* t: g( ?$ u  s3 X, r& o* e
' M/ }  [7 V; t8 G8 q! W8 B; [
8 g* P% j8 u& m/ }* O( c

" y  L, k# Y1 V5 B5 G6 u$ P6 gclc;
5 [8 F9 M9 q: F" V' Xclear;: k/ W7 k; \$ I3 p3 c" S+ L$ T3 }
fidin=fopen('title.txt','r');2 {3 ~$ }# T% a7 E& w5 u
9 Z+ F7 f, f* g  {( Z
fidout=fopen('result.txt','w');* T9 n. _+ Y- l, J) \" Z9 t+ a6 J

) c6 @" `% L: _' m" n1 xwhile ~feof(fidin)                  %while ~feof 表示 若 未读到文件末尾 则 继续 循环
5 u8 ~; l* C) I: x/ ]    wellname=fgetl(fidin);          %如果没有使用fgetl函数,则feof判断没有作用,这将是一个死循环!8 ]; `2 n+ b* C6 j
    titleline=strcat(wellname,'.txt');
7 @1 k9 C9 z% G9 v7 z( d; ~    [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(titleline);
2 E4 V) L/ s4 _    efc_rst=[efc_dpt,efc_poro,efc_perm,efc_ratio];
! w/ Y& B/ O, C3 M, A    fprintf(fidout,wellname);
& y. c" A- s2 \" V# v' r    %fprintf(fidout,'%s %s %s %sn',efc_rst);
1 V: n3 A2 E6 y0 p7 R    fprintf(fidout,'%8.1f %6.2f %6.2f %6.4fn',efc_rst);
  |$ t! ~1 y# @" ?& R9 h2 k3 Send! d( ^. I* F- ^
fclose(fidin);
3 j. k" x: i  ~  j4 e, jfclose(fidout);
4 H5 T6 P0 F4 o, `( Q
2 S5 ]. `. m7 k) V8 d. z . A( A9 `7 e& X3 x+ f

2 P: o$ J$ ?8 ^+ a' ^5 h部分文件名(title.txt)
- o' `& n3 C8 S1 s5 Y4 a$ R0 T, [' q% X) n
B12-B51-589 ~1 I& B4 N; x3 y
B12-B53-589 G4 [- L0 C6 c! B' P+ g# a+ u. i
B12-B55-59
+ K! S' h$ V+ n4 C% K+ lB12-B55-62
3 r( R; r2 x% i! Y# }B12-B55-64' C. a$ M" ^8 t( \1 t5 c$ \
B12-B57-51
% r! P3 x+ B( C) ?0 lB14-B50-44
/ U8 f8 ?  n2 Q6 ^B14-B50-48
2 L; s" z  i* r0 h0 vB14-B51-46
1 y1 ~9 r" z/ Y. E6 n- b; S1 LB14-B52-49; H, t+ k. |+ f
B14-B54-48- }+ n0 i  {# I! L: b4 @; b  d5 g4 h
B14-B54-53. \9 z/ [4 _, c2 k1 [7 ~9 Q# b
B14-B54-74
5 j! [+ u; [. e* P6 dB14-B55-52) G% Q! U8 d4 Q# ~' F1 S
B14-B55-56& H! `7 U% k6 G1 U, b3 p
B14-B55-60
7 f* i  J; r4 ?1 J. `B14-B55-630 X9 D: {7 {* m2 K# u/ c( K  Q
B14-B55-65
0 i& v1 p! X2 nB14-B55-672 T. ]$ G# `+ R  ?; J; S/ t
B14-B55-69
, u7 v' Y  O( E8 X$ Q+ Q5 `; pB14-B55-75' o2 ^+ @/ T3 }& s9 X! w# ~/ u+ W
B14-B56-49
! z% S/ o' ]4 D* B/ I0 q; ~. ^B14-B56-53; u$ l6 L: q4 H( C& _( m
B14-B56-70) S: r6 H! y# I7 J5 e( M* Z

  u2 @( d  x$ I7 ^* q7 r$ t' q+ J…………& r; ?) n) Z4 y% F  Z$ T1 [8 I

4 d+ F, R, m7 F4 r" L 2 c/ a3 K% q5 a/ S; P4 K

  j" u# h% o" v# K: b; pfunction [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(file)
0 C7 |5 a- [7 l%读入数据,进行处理,输出结果
, x# b; j* L0 W. b5 L    matdat=load(file);1 x# v( A3 W- i$ f; g9 {+ D
    [n,l]=size(matdat);
0 G  R4 }& E7 j! m- F% g9 D   
0 _. M  l; J! K) O! `1 T    efc_dpt=0;
' \4 R2 R0 C4 r' ^7 a, x( X    efc_perm=0;
  C0 W# N, x; m4 @    efc_poro=0;
6 \, X8 m9 q6 w! V    efc_ratio=0;
! U0 w( o% t1 z  Y   - k1 \6 o* a( ?6 P; |
    for i=1:n-1. p& h/ m9 W  c' _1 o( x: H3 X
        matdat(i,1)=matdat(i+1,1)-matdat(i,1);
4 r  _; U# Y4 o  A# c    end
" q, l) n4 S: B   $ n4 F' K5 Y9 @- k5 q1 ]. ]1 F) H# N
    for i=1:n-1
4 ?, R! v% a$ l6 r% D        if matdat(i,3)==1% S' y" Q% h, B+ R+ \5 u+ N0 x
            efc_dpt=efc_dpt+matdat(i,1);8 `& e- U+ |/ g* N/ d
            efc_perm=efc_perm+matdat(i,5)*matdat(i,1);
5 w9 L; L- u/ o% @- W4 J0 Y* i            efc_poro=efc_poro+matdat(i,4)*matdat(i,1);. X; d' m3 k+ c! }' R, C
            if matdat(i,2)==0/ b3 x" \0 x+ v: w/ |1 P
                efc_ratio=efc_ratio+matdat(i,1);
, T2 [. P7 `* u+ p$ P0 f5 g            end
( X0 `) M8 R; k" x        end
8 I+ ]; G$ i! |3 J9 M' ?2 j. Z: n; v    end: [" H% D6 ^" C; I1 A9 Q( ]
    if efc_dpt==0
+ |7 [4 h" B$ f. K& W2 P  |        efc_perm=0;
# b, D2 @0 k% O. ~! S4 d0 x        efc_poro=0;
" @& \2 n3 {% S4 D        efc_ratio=0;
  K3 V; L& h/ O  `0 e
2 K/ I$ s0 q. h) V# g    else9 w. \! X) ]  D0 x5 Y2 p" _% h
        efc_perm=efc_perm/efc_dpt;
; x) W, f! G7 V& @4 K4 H        efc_poro=efc_poro/efc_dpt;
" {8 p, p7 q) `/ i' w        efc_ratio=efc_ratio/efc_dpt;      
& K: Y8 x9 E& R( J7 mend
* t2 l" E8 [* ]3 v0 p- M6 x9 V4 d3 F6 X0 T

+ [, E1 \; p5 o
: }2 s6 A0 x  v/ V3 d( `井的数据  n6 K7 M6 `" J. c$ }; m

3 M0 l1 N% S  Q1865.2 3 0 0 0& e( P8 s; Q" k! J
1867.8 0 1 6.8 0.1
# ]/ T" _& n3 y  H) t+ @3 O1 k5 V* q1874.4 3 0 0 0
. T# t; `5 T& R/ G( u7 Z1885 1 1 3.3 0.02
% @6 V% y: ~) `8 T1 e1888.8 3 0 0 0
8 S% C- o+ D1 E; n5 K8 v1891.8 0 1 2.3 0.03. \3 v5 q0 P* |" u! v" Z- R0 `/ p" ?
1897 3 0 0 02 I( i: _& |) _- F* ]
1898 0 1 2.3 0.038 |8 X. k- F& a6 o
1903 3 0 0 0
) u% _; F+ ^7 {( T- O6 z1906.2 0 1 2.3 0.03& P% R  ^1 b8 C' c
1911 3 0 0 0
9 x4 T8 [1 A- C" ~2 [; V8 H1914.6 1 1 3.4 0.21! a5 a5 x9 d) Y  q
1919 3 0 0 05 s  n+ o# R. M1 d. L& ?
! Q3 V0 g& ~2 C! a# {' L  o5 O
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9 n9 c- c% C9 b8 i8 F% I. K* x' H7 N* V/ O$ `" Z, o' g
多数据文件批处理的一个技巧9 B+ M8 F/ h& I5 R

' A! O" {. q  U& i# n) B0 h数据处理过程中,很多时候需要对大批的数据文件进行循环处理。如果文件名是有规律的,那么正常的方法尚可处理,但是碰到文件名没什么规律,或规律不强时,表示出这些文件按名就是一件很头疼的事了。假设现有以下文件需要进行循环处理,以供参考。" g& t7 m+ \. M3 [! B
+ r6 K+ W4 g5 N1 e  P: z& l! n
1、MATLAB / n; m) D8 j4 g8 o! I. h# U0 G
clc;clear;
. q1 ^4 i& x( h6 f%--将'e:/POP/data/'下的文件信息写入构架数组file_structure9 ~' U) Y: e1 S' c- _
file_structure = dir('e:/POP/data/');
( Y; a2 c+ |/ L8 ?3 g%--file_structure.name下是'e:/POP/data/'内的文件名4 {- z8 Q* Y8 f$ E5 R
for i=3:size(file_structure)      
3 g7 Z# U* _5 f5 _$ N, {
/ d2 V3 A) }  h4 p  T( e  filename = strcat('e:/POP/data/',file_structure(i).name)                 % stract 连接字符串8 N& T& f) U/ z( W  ~( p2 Q7 k
  f=netcdf(filename,'nowrite');  
9 m1 y3 v9 W8 g. W  a=['在此对f及里面的变量操作...']  
6 j1 ]8 ]0 J& b+ i, @  close(f)% s) ]; b) l' U# d' L
end/ w5 J( g6 U$ c" m. f- k  p" n

3 T  [# P  q+ y4 I $ h6 J6 p9 p( s1 ]' V# A- A
-----------------------------------------------------
( u  i( H/ ]/ Z6 ?: ~" e& i7 ?/ i怎么用matlab读取多个数据文件?& t& I3 {9 |! ~  ^0 Q
( y) G$ b* p- n9 v% Q
: c8 e4 ~1 P! ?. T, @
1:如果文件名规则
8 E& I9 P- M! _+ U/ Y4 q1 |$ w7 L. f& X" ]! K0 g# I6 b# q$ q

1 E( u" J* b  v: h1 C, e( |0 g% 文件目录:% e. s+ D# D! @

" m9 Y! l( B/ f2 K1 w: p- W4 J6 ^. f8 Y5 [* t1 b# F; W3 a* A  k
my_dir=' /home/my_calculation1/test1/';0 T" E( n- U0 o$ B

0 s6 D; n+ @6 X8 W. b8 t0 n; d/ Q/ B" {
8 k) x( T( Y+ c3 A7 R" X! ?
: x3 t6 @, t/ D  N, _

) |1 y8 K, M6 u  T3 ?( Y%文件名前缀7 L8 _4 W/ B; J6 W8 d
: s% g) r4 d$ R" r/ K' W
my_pre_T='test';
9 i+ K8 E7 ?, ]  n6 v%文件数目 fnum =1:32; %Read files for i=1:length(fnum) filename = [my_dir,prefix_T1 num2str(fnum(i))]; 然后dlmread,fopen等操作就不需详写了!与单个文件一样。
( U0 Y. P- e! w. bend
7 i3 C  F- f, x$ o( m0 B+ P5 h9 [& }+ x- `% G/ p* x; ^
" Y2 Z/ i, _+ O$ A7 w  ]

* D  h; c' Q. H5 M
* p& x- I& y, h6 H+ |" J/ N1 X
- a; z: }; E" D" b8 s2:文件夹数据批量读取的问题,命名无规则
+ c7 Y$ W) i+ L! r在windows下很简单,ls函数便可以得到一个包含所有文件名的字符矩阵。可惜在unix下得到的是个字符行向量。当然,处理下也可以批量读取数据文件,不过不想再写了。因为另外一个函数也可以实现批量处理数据文件的功能。即dir函数: q3 `$ t+ e% H. P

7 M; s- [2 i& W/ _LS displays the results of the 'ls' command on UNIX. 4 S" L. f  m3 `
) Z" o6 i1 h4 e3 K3 y

, M/ C3 f- D. Q" Y( D. W0 `
: w0 K5 [& U# B3 lOn UNIX, LS returns acharacter row vectorof filenames separated by tab and space characters.* L) Z( a. C, a8 C

! `' w  `7 y8 C; K# A
5 r. o0 o: P8 V4 O
+ C! @6 y0 z6 [* Z% f. o) ]" C- X3 C2 \: R
* p) d7 b  p( r$ |
9 i# X3 Y, ~$ Z

# ^2 o/ V! V+ o# `* `假定.dat文件在/home/my_calculation1/test1/ 文件夹下,文件名符合matlab变量名的命名规则,要读取第二列的浮点数字为数组并以文件名为变量名。
/ c9 b/ {8 v- \0 Z7 u
8 e" I# b3 L# Y0 N8 x' A
4 i/ |% k. ^0 F/ X
  m" [9 b! v$ G6 i/ c4 U( Tmydir='/home/my_calculation1/test1/';8 S7 g+ T6 V4 p4 Y, }9 S
) K9 _" ?6 B: X4 S, h" ]! _- N
temp1=dir([mydir,'*.dat']);0 W4 L& f; T% j8 g% K1 n5 G# C! N/ G
9 P  B+ z& N+ }3 N% w; Y
5 I, W0 O$ M: |7 W( i/ d- ~. o

9 ~0 f2 E" o1 [1 t
! `  o) o* d$ itemp=dlmread(filename,'',0,1);% L% B$ G9 z* k9 m! |4 }4 Q

/ e* D: }" F5 E, M1 _6 M4 b
" p; o! K- N/ R4 S5 L6 F
- J2 ?0 R9 v+ `- g& j6 w9 ~
) {9 m7 C, h. C, |7 t2 u
& z7 q, `- ~; f" z3 g" q9 e6 r# O8 s' E3 N7 |; B
1、利用dir(外层文件夹)获取子文件夹;
$ E: M# N' N* V# }: Q+ ]4 u2、利用dir(子文件夹)获取子文件夹中的文件信息;
3 [, a( }' h  y* H7 b! n+ `) D3、遍历文件,做处理;- C2 v* A2 Q) C& [8 y/ h8 _
对于遍历文件夹,也可以使用mathworks网站上的函数dirr轻松搞定。
$ A0 `( O0 ]; F/ U. q% D- y1 m: }) v! F

, n9 v8 W9 e! {0 c6 b  T) p+ V$ y: ?1 Q$ W" }) \" e0 L
注意:如果直接使用 temp1=dir(mydir]);读取文件夹下所有文件,应当从第三个开始才是目录下的文件。 另外,使用dir还可以遍历一个文件夹下的所有子文件夹。
6 H" v" E( D4 b) K# Qeval_r([temp1(i1).name(1:end-4),'=temp;']), E/ b+ N5 {2 |+ g' j, `9 ?
4 I- y3 t& k8 s5 H& s

9 a0 S/ V. W# O* X# p. `dlmread,fopen等操作就不需详写了!与单个文件一样。
8 v' s. [7 Q1 [) ]' e" ]4 x6 uend7 {  e, I( d. G5 H9 S
/ r1 V  m2 Q# Y7 E" w2 Z' e! ]
; Q0 H- p# h6 g3 M9 A, e; J- q
4 M  Z/ D9 S- [: y$ C) j
& y/ B5 b% t7 k

2 ]! B5 j) n2 x8 B! Z
- S% b* C* E$ ^num_temp1=length(temp1);
. O# h6 s9 b3 ]- o/ j" H* P3 T8 ]9 f9 a: ~# \$ i) H. x, N+ U& B, M. X1 o
: p1 r; I6 i" }3 v# b7 @# B
) I1 j2 m( S. W7 ]7 o
' g3 {% \3 |; {4 m4 ~/ l
for i1=1:num_temp19 T+ E" e: t1 @# Q# q

5 a9 E8 I: T& ?& e. {3 G% s5 y: E8 X' t. c. `, S* d
filename=[mydir,temp1(i1).name];
5 ~  @& j! j. g% ~9 u2 N
% N1 v3 p" @9 o4 I( a+ H. h; t! s7 Y& \; h
- o0 j0 S: E7 u% d2 M
; m' C" p" k' |: v0 Q" U

, J+ R+ f0 {. b1 X, k+ H5 o/ y# O& T7 Q# s# J: t

! j. n& ?2 |& k* {# I+ x" S
- ?, [( i! W) j: a  y' Y" c' Q
; ^3 h3 ]- R+ c; V1 V6 D& t0 {" Z2 I

* ]- @' i- z! i& w2 _2 J: j现在有一个文件夹里面有50个的.dat文件.每个文件大概三万行.两列,第一列是字符串,第二列是浮点数字. 批量读取这个文件夹里的.dat文件的第二列。读取完以后的数组变量名就是.dat的文件名$ P( r" S% O0 C3 p
& c4 m: `; `! a* C- z9 Y

+ f8 J9 }: U; d) p8 P4 Q. K9 Z/ N8 @# j1 U" V( m* D' c7 {1 F2 ^
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.
0 p! f- Z9 `- v
9 j8 J6 [" t+ j) g6 W9 u
4 X5 b! x+ ]/ Y下面介绍下使用dir函数读取文件夹中文件的程序
/ g- S7 N; @( n: P. p; O. C$ _2 S7 |/ N: O7 m! d
4 N( i' g' e8 u8 g
2.1 读取所有扩展名为.dat的数据文件,并进行处理。9 P$ ]+ \$ |) x- x, j8 h0 X
3 _' }3 N0 a- w. G; _

- U+ V9 i7 d7 {6 P5 `matlab中,也可以使用通配符的。下面就来展示下:

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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