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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
网上搜集的几个代码,很有用,保存。
: X, ?9 u% M) K0 `( |4 V4 l5 w" U  c6 p9 \# j0 y6 L% X) C
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ t! B9 t8 S  I# }3 _4 w

% p0 J" v1 c( X4 n: R+ X  w* `" B1)要读入的文件下的文件名称依序列的方式命名,如a1b.mat, a2b.mat,...,ajb.mat,...
1 |1 T4 [1 u: K
) f/ I. c9 L' i. w   循环读入
  t0 A3 G! r6 P6 e+ j
( d# o! H7 ~& ^# [4 f2 N   filepath='';%文件夹的路径
6 e, Q' H2 k& R% c6 E: C/ a" Y
   for i=1:n  %n是要读入的文件的个数/ F7 z# \" `$ H2 C. u4 v) m
3 y0 g& Z8 O, O2 s
       load([filepath 'a' num2str(i) 'b' '.mat'])6 d5 ]$ Z, @9 N
8 U! s; V0 Z6 `) ?3 G$ J
   end8 I6 N! ]% Y' G* G% N
$ Q, G- e. S6 a4 _0 [
2 k# f3 `8 `6 _5 e. ?/ [
( \& s" }0 a" o3 u$ _
2)文件夹下的文件名称无规律
; O/ y6 U1 U: S9 }7 \
) F* }# D8 B- l! |2 |8 A4 t    如,文件夹里是n幅图像(.jpg) 和一些数据(其他类型),现在要读出所有的图像3 W" C' x7 q7 O7 [4 K3 [

* v. k6 b8 l" Q' C+ s! U  _     a,先得到文件路径5 W7 Y, U* t% |1 X  t9 ^; ^
        di = dir('文件路径*.jpg');7 N1 L, o+ x( R0 A- d
     b,读入
3 M( ]/ G2 g' s# Q       for k= 1:length(di)
+ u2 f" Q$ {* @1 [0 Y  \# H% O  R           I(k,:,: ) = imread(['文件路径',di(k).name]);
3 l' K9 M7 f2 I! E       end! E% X  K$ f/ K1 I8 @% [! K: ^
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% H  S& x8 D' ?% H1 n5 x0 j1 L
主程序:4 J0 H& D0 j- U; D
; H; \9 x- a2 P/ O

/ W; B: g/ D* b8 i! G1 e: Y1 {: O) ?- }) s) I$ r
clc;5 t7 l4 }/ T( f% u4 }) P& A' H$ c
clear;
& G7 Q7 C( \# `1 jfidin=fopen('title.txt','r');
8 X, {3 A: q0 {* v5 `. L( z
( d- t2 W  s: `7 Nfidout=fopen('result.txt','w');3 O+ @) s# r8 G' ?
! Z" C& b1 z0 a& x, k0 K
while ~feof(fidin)                  %while ~feof 表示 若 未读到文件末尾 则 继续 循环4 i4 [# p% {- q) g# v$ m  H
    wellname=fgetl(fidin);          %如果没有使用fgetl函数,则feof判断没有作用,这将是一个死循环!: M: X8 b2 @& n5 J$ @
    titleline=strcat(wellname,'.txt');7 k8 a9 r& D7 a4 X! ]3 A
    [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(titleline);
! J0 ~  Y1 K, F: q- Q    efc_rst=[efc_dpt,efc_poro,efc_perm,efc_ratio];
2 G. ?5 ?. S( f* U5 J, p    fprintf(fidout,wellname);
! e& K% S# g8 L: l: w    %fprintf(fidout,'%s %s %s %sn',efc_rst);: F4 \: w" ?* ^2 o$ v$ C
    fprintf(fidout,'%8.1f %6.2f %6.2f %6.4fn',efc_rst);$ W: }7 \* u- V- v& X
end
$ d+ S. k- z0 d, L" Bfclose(fidin);
$ ?2 S' K* D( }fclose(fidout);
) h. o! i- Z: L+ t9 n+ }0 x% l: G. D* |8 t' {- Z
% {2 M5 ^; H$ u/ ~

: x% r3 W% ~' _( R部分文件名(title.txt)7 z" e" K' i" N; k
& m! E- z2 |1 A3 R4 g0 {. {  ~9 d
B12-B51-58; k8 p4 Y7 V" V9 B1 A
B12-B53-58( i: ], r3 Y  u% d7 N
B12-B55-59' |' Z5 y5 v* S
B12-B55-62  k  \6 t# z; |. G# a+ B# R
B12-B55-64
3 [+ V- b8 {9 @B12-B57-51
$ o" k! z: I- l* `B14-B50-44, }% D1 V+ F) E$ r: z' d  w
B14-B50-48
4 U" ]$ m9 s% lB14-B51-46
/ t% O  v3 L% ~  Z0 u" hB14-B52-498 @9 P+ }. w; ]  j, ?
B14-B54-48
5 R5 q1 i- j$ `- h1 jB14-B54-53
: j/ j& R: @$ PB14-B54-74
, r* `& _3 W' {) M) X% I4 fB14-B55-52
* ~+ r- G  I: uB14-B55-56
) K! j6 ]8 ^9 K5 oB14-B55-60
* ~3 j& p' ^' `1 d' |B14-B55-636 }8 O4 N# p2 T, t1 n( W  E
B14-B55-658 j/ L) N* n) z2 |2 ?$ G2 s. B
B14-B55-67- ^, h) O) b2 h% G
B14-B55-69" T( v& ^3 E+ X( l
B14-B55-75
+ _% G6 a$ f! ^, ~B14-B56-49% h6 u* L2 y+ l# E, @
B14-B56-53
$ ]1 N) K" y% ^. `B14-B56-70  q5 V/ ]: U& D% q
# B" @2 \( P2 ?$ q. X
…………
. J3 k. x4 Y; _1 d
! s( y# h( \  a5 A
6 L- {- v# D3 K' Q: b" Z, S0 `0 {9 t( {2 H
function [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(file)/ d, P" G- z6 [5 r. W- B
%读入数据,进行处理,输出结果
3 @& n% o+ r' f/ }    matdat=load(file);5 H/ e: V: c! p: C: u' ?3 l
    [n,l]=size(matdat);
$ m) B0 g( t5 s' R3 V7 ]5 u4 d   1 O/ [/ m6 x# ^5 ]
    efc_dpt=0;% i% E3 E3 l2 K" [2 S* V% k" x
    efc_perm=0;
5 m) |% R: a2 d8 q+ l/ q/ B. C" K    efc_poro=0;, u3 Q  M; ^: l
    efc_ratio=0;* g# W; B  A% b' @1 j
   # g. s( ?( r0 g+ j) m
    for i=1:n-1, P& Q; f" H2 Y! Z) m& V8 F
        matdat(i,1)=matdat(i+1,1)-matdat(i,1);6 J6 f, y$ M$ Z3 G6 D  U% m5 A
    end) A0 i" X: c4 m( l+ ^- M
   
8 o% H# ]9 _1 o2 a    for i=1:n-10 o6 U1 C, h1 D( z4 G' n
        if matdat(i,3)==1
, E5 V2 l7 z  w5 D7 S  S$ a            efc_dpt=efc_dpt+matdat(i,1);
" E8 B9 E9 G  n1 |9 y3 X            efc_perm=efc_perm+matdat(i,5)*matdat(i,1);
7 E) z8 J: w  k& Q" r            efc_poro=efc_poro+matdat(i,4)*matdat(i,1);
& a) z, J$ A0 G  H            if matdat(i,2)==06 u- A7 W/ j/ l, v, o
                efc_ratio=efc_ratio+matdat(i,1);
  A: H5 d6 K4 r/ W0 W+ j            end
; S2 C0 N- H5 k" |; C3 z2 e        end( X" f; O0 m9 e0 K" R0 b# H* q/ B
    end4 A0 ^* h/ `; M
    if efc_dpt==0
$ u& J+ v- V5 B8 m        efc_perm=0;
8 E$ F# E) H, Z        efc_poro=0;
) U+ x; D) c6 H. _5 Z; B        efc_ratio=0;3 ]1 H/ A! N9 v# c/ ~

/ d) o) ?! ~, O8 k    else4 N9 a: C5 y" u- y/ F( u6 q2 ~3 g" d
        efc_perm=efc_perm/efc_dpt;6 x$ K, f( s; W- f" s
        efc_poro=efc_poro/efc_dpt;% i4 I. H- k% V, c9 ]2 C2 v
        efc_ratio=efc_ratio/efc_dpt;       8 ^0 F" A  B* \& i6 A
end. o/ K! U6 |9 z  e
2 O' Y! P9 l' i% v1 Z/ h5 M

. i, b$ M* Z! o  x; |" l  b* ]" j" \- _
井的数据
, g6 F* ~, e, y3 G# n- V) m3 f9 E& @. e8 O8 l# U- @7 Q
1865.2 3 0 0 02 C+ _: U  D: m8 U
1867.8 0 1 6.8 0.1& B# H4 P0 ?7 r  r( C3 x
1874.4 3 0 0 0& X) }2 U/ b& B' I2 j+ e
1885 1 1 3.3 0.02, B7 Y! J- U, d
1888.8 3 0 0 0$ i: ^# ?4 {8 C1 M( t+ M( T
1891.8 0 1 2.3 0.03
# D* z' ^5 T' q7 L( S# G1897 3 0 0 0& N6 b. K+ y* D! t
1898 0 1 2.3 0.03; h: L! {" W# C# k, e8 t, V5 Q+ c
1903 3 0 0 0
7 U% G1 U* V+ T. |+ H2 v1906.2 0 1 2.3 0.03" ?& J) [/ O1 ^: I( d
1911 3 0 0 0$ V) Z/ ^' f, y9 r- \. E
1914.6 1 1 3.4 0.214 o' R) A2 v/ h+ s; E) i5 r/ ]- e
1919 3 0 0 09 X( ^8 s' h( L6 Q

, y, j, D! o: i1 T: C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* r' }( T% b$ L5 y; H) z9 ~% N& s! A
多数据文件批处理的一个技巧
3 t0 o' b4 I* ]' ?
! {2 D$ B' U$ O: d  E+ c7 J! Z  r/ N9 e数据处理过程中,很多时候需要对大批的数据文件进行循环处理。如果文件名是有规律的,那么正常的方法尚可处理,但是碰到文件名没什么规律,或规律不强时,表示出这些文件按名就是一件很头疼的事了。假设现有以下文件需要进行循环处理,以供参考。
. Z  R+ G4 c& K+ q( h, I& q, I4 o
1、MATLAB
9 ]! d5 k& f2 e4 o+ ~; }clc;clear;
6 B3 |0 `. w- M7 X1 e' F%--将'e:/POP/data/'下的文件信息写入构架数组file_structure
' U3 d7 C; {  }0 l9 Qfile_structure = dir('e:/POP/data/');
3 F2 R9 @6 V4 p: E3 U+ ^$ ?%--file_structure.name下是'e:/POP/data/'内的文件名
! E, E) J. F8 r: Gfor i=3:size(file_structure)      ) j/ s% ^  G; Z! c3 @' T

" _2 B* R0 R3 V' L/ G$ t  filename = strcat('e:/POP/data/',file_structure(i).name)                 % stract 连接字符串8 [6 c4 C: i, v) M5 {9 H
  f=netcdf(filename,'nowrite');  8 W  B( ?+ g% z. c) t9 \
  a=['在此对f及里面的变量操作...']  ) k9 B1 C3 e4 F, P
  close(f)% r9 v* z/ [, H$ J/ n
end$ z% b; j- c# t0 b

0 P: {# A4 r( M) H8 b+ B $ n. k% u2 E: s! T5 N) [, }1 [6 b
-----------------------------------------------------
; Z  |7 }0 W! S怎么用matlab读取多个数据文件?1 X, ]" I  H+ g

% |% V: y1 N8 O( I$ I+ l% L  D( q8 D1 O
1:如果文件名规则
: Q. w- H' f* Q3 B* w3 A3 k; g1 M: C; I' W1 e1 k" y  D3 ~: n
  k- v  D* l0 B7 x6 b2 c$ w. @
% 文件目录:) I: @* u2 \4 g( w! d

/ h) {+ g+ O) F+ m' d+ r
' h; O9 ]6 ^# D, |% {my_dir=' /home/my_calculation1/test1/';! W, J( Y2 L: S3 j) w1 `' s3 w+ D8 q

( o( U& P/ y( s. A0 t5 K
8 Z1 Y9 y$ U- |& |/ l- Y
$ N; c# B+ x" ?0 O( z
' {8 L# {, W8 I/ s
3 w: i% M% k1 A%文件名前缀
! ~- a- ]3 S; `3 n+ P. c0 l% ^0 k8 j& K0 N1 @0 m3 E- P0 K. q' U  G: X
my_pre_T='test';
! T8 M2 t6 }0 _1 I, Z%文件数目 fnum =1:32; %Read files for i=1:length(fnum) filename = [my_dir,prefix_T1 num2str(fnum(i))]; 然后dlmread,fopen等操作就不需详写了!与单个文件一样。0 a# z8 _" E% g7 ]" s1 ^3 C, x
end, F( _9 |# F( b+ c( r4 @6 I
% t0 D" X( ^% M1 E; Z

7 Y! d# ?: P7 ^. M
! O$ d  W& W: S3 H' W& j, q! m& d1 X. K, t' E9 X# a' f

- P; n% T# J8 z$ @+ [- J7 v! x. e2:文件夹数据批量读取的问题,命名无规则' Y; ^( x4 p2 m8 l# r1 {
在windows下很简单,ls函数便可以得到一个包含所有文件名的字符矩阵。可惜在unix下得到的是个字符行向量。当然,处理下也可以批量读取数据文件,不过不想再写了。因为另外一个函数也可以实现批量处理数据文件的功能。即dir函数8 _/ Q# g% B7 W8 e. y' q
0 [% X3 L4 v+ e8 n' Z
LS displays the results of the 'ls' command on UNIX.
+ X5 Z& j5 |% d- g* F1 i/ X9 i( m3 w( t" ^/ |  Z: T
" r3 [( m" W4 a

5 b8 y2 Z$ Q! j4 LOn UNIX, LS returns acharacter row vectorof filenames separated by tab and space characters.
3 {' r2 Z# z. S; e" r! B
! Z; ]# T! n0 x+ Q, `" C5 c$ ~% }5 _) T) g

8 P+ z# n, a- U0 M0 e7 R- ^. f# Y- J- r' {) X$ ^
9 l$ H; S, W3 T: |, D$ {7 A
  g1 u; |2 A% s1 f% y$ N
1 f* i( Y9 Y6 |! v
假定.dat文件在/home/my_calculation1/test1/ 文件夹下,文件名符合matlab变量名的命名规则,要读取第二列的浮点数字为数组并以文件名为变量名。
* @+ l! D& U0 K) {( r/ t$ T" q/ H5 T7 o3 O
, L; A7 l9 l; e  D3 W: ~2 d* \) Z
2 ?+ l% L& m: h2 ^* e6 @$ W& c
mydir='/home/my_calculation1/test1/';0 f0 l' G: R2 t/ v

  S2 m6 S7 E3 D2 ytemp1=dir([mydir,'*.dat']);+ S% ^2 n5 Q# C! K4 @( O( a
% X6 z; B. ?& F" Z
; N! P' s# {& n! O9 d' D: l

% u/ f3 {! E+ @% o9 m. G  n9 I' a
; A5 U2 F( @! ~8 c5 o( l4 ~+ Ptemp=dlmread(filename,'',0,1);4 ?: e- y# F5 s3 \3 `" |

6 ^( J! ]- y  U" l; z' ^9 Y$ A% b0 L, W6 N$ s
, ?- l  S2 _  Z2 s2 p
. N7 ^! t4 C) Q) h, U

* N6 I) S( a& i  h; q; r7 F0 r$ Z' U3 X) _: U4 j% K" C$ D' f' ~1 G2 l
1、利用dir(外层文件夹)获取子文件夹;& y5 O; L+ l4 q/ u3 j. X% J* U
2、利用dir(子文件夹)获取子文件夹中的文件信息;
7 |" E7 M' @  g3、遍历文件,做处理;0 Y. l- }: h8 T* R. y
对于遍历文件夹,也可以使用mathworks网站上的函数dirr轻松搞定。
5 p) \/ A# }. a, N$ I8 s2 \4 r2 x9 F
. u9 j7 n2 r) j! e+ S6 b( \1 S( m# {. p5 [- i- _1 H" W6 ^

4 W; M: }4 u) T% |! c  x. h; N注意:如果直接使用 temp1=dir(mydir]);读取文件夹下所有文件,应当从第三个开始才是目录下的文件。 另外,使用dir还可以遍历一个文件夹下的所有子文件夹。2 ^" I+ B$ Z: E3 b5 o* P
eval_r([temp1(i1).name(1:end-4),'=temp;'])! x0 i) C! K' m  l& h
* z+ \; Z% V9 g% |# y: Y

/ {/ y% p/ z2 jdlmread,fopen等操作就不需详写了!与单个文件一样。
* \( Q2 [# v& eend
0 g" `7 h/ x2 N8 }2 o" P" M7 `+ ?. I' t
) X$ J0 t6 X7 u& P" z- n
  j% C) U, U1 Z  V' }: B

* G0 D3 S# A+ n/ Q$ P5 c3 f) h( G& I* z: M- |$ q3 A: z% ~8 a
9 D' i9 A- f! J' w& t8 h: J
num_temp1=length(temp1);" E) l3 k& F3 \3 p* O7 j

  |' k" X6 f. L: P& _6 L  y6 t: @5 d& f/ Y% z' r

4 t+ u. H) [7 a0 l
& t# G& w5 m7 J! X  ?# afor i1=1:num_temp1
; Y* S# `. o7 T$ q6 I) g6 Y- T8 j/ k% J

, ]3 {. z" @5 h1 U% Z$ ?filename=[mydir,temp1(i1).name];2 C4 R$ E! d8 u: a8 l+ f

$ l' w- [; ?* O3 c  Z
: S4 M7 e! {/ U  x+ l2 T+ ?" M7 W1 Q; T, d
1 }9 s; |3 I, k

* P1 p/ d: ]2 f4 P1 T) q0 W0 G7 Y- n2 E4 r
* v5 U) E7 }3 P, P6 Y  C, Y
/ P6 K& J; A1 H9 i; n7 \& P
+ p" _, w8 G" q4 ^4 @( d

& f/ }* Z% Z, w& v' S3 ^2 H8 k) C
9 _  s6 I* V4 o1 S) P( f现在有一个文件夹里面有50个的.dat文件.每个文件大概三万行.两列,第一列是字符串,第二列是浮点数字. 批量读取这个文件夹里的.dat文件的第二列。读取完以后的数组变量名就是.dat的文件名! h0 N9 `" j% E, D8 i9 q
, \# _) l) ], }2 V1 G0 S
5 h+ o( L& N$ I$ ^! v: U# D. Y
2 b& y3 A5 m9 `5 J" g, I" @9 k' q
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.
5 z) n% _4 ~2 i/ S/ {
# c7 o; A& _1 ~
8 j4 r: I) I* {; Q, c下面介绍下使用dir函数读取文件夹中文件的程序
, V! e& G9 e( F! i$ V- {
8 ~/ Q6 i. I0 G. r% @, q
/ `0 W( _0 v  o) h$ X$ n7 Q) W2.1 读取所有扩展名为.dat的数据文件,并进行处理。8 p+ ], T) @/ ~+ D" R! ?4 G

$ F2 k" C2 F& i9 r& L: ^* h2 {, T% Q+ h" O6 S% {' `; U8 h4 _9 i* x! L. S
matlab中,也可以使用通配符的。下面就来展示下:

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 11:15 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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