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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
网上搜集的几个代码,很有用,保存。
! }( `, X$ [; o( b8 @7 F% f" V' q
3 `3 n' V( v. H  w++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' S3 _" o/ ~* X9 F( a1 k9 _
1 O$ x) w0 f8 ?
1)要读入的文件下的文件名称依序列的方式命名,如a1b.mat, a2b.mat,...,ajb.mat,...
9 F& ]3 V6 z; c6 h, n; k! z, m0 a  c' R* s9 `
   循环读入8 {# |9 e5 Y# o# W# b

; Q- b& X! @6 t2 ?. j! \   filepath='';%文件夹的路径
- M# H$ Y+ H7 t5 X# B
! Y5 h- p8 a9 S" {, B+ `; k   for i=1:n  %n是要读入的文件的个数: Y' z' |6 S" Y0 @5 D8 `% k
. }. W0 q- ]& ~
       load([filepath 'a' num2str(i) 'b' '.mat'])
6 {" D$ r1 \4 V
' I& D0 R6 Z: W8 r   end
7 Q/ |$ p# v) p8 k) N5 X1 v/ T/ [2 b% v5 q, P+ L7 G! o& c; R# n( e8 l0 X" W

& g: v; [* Q) O2 M3 e7 i5 k) {$ s3 T# ?% X
2)文件夹下的文件名称无规律* b' \5 [: ^- \7 E  Y( {

" j) h. T4 A- d: R1 C5 Y( P4 @    如,文件夹里是n幅图像(.jpg) 和一些数据(其他类型),现在要读出所有的图像
* }/ p  Y- T4 U
* l( M3 z+ S; D, U2 [: ~# I! J8 z     a,先得到文件路径
* z8 }( D1 b8 d4 H        di = dir('文件路径*.jpg');" B/ q$ l+ G, I% |; S
     b,读入
' |, F) a  g7 j( I4 q/ p0 B5 Y       for k= 1:length(di)7 G( k7 f: A# P  E6 [# i1 o
           I(k,:,: ) = imread(['文件路径',di(k).name]);
4 x3 ?5 k( ?: F3 ?7 H; \& F, Y- n       end5 z6 ~/ b0 L7 }- d0 p' _; Y! T
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( c! P# Q! S1 G+ [0 ]# h
主程序:
* B5 e, ?( Q+ F* [2 u0 f- i0 [7 j$ r6 S

' ~8 o. L7 o6 J0 P3 W0 z# R& E. k  v7 N) l; C+ W) B" [' @1 V
clc;9 ?2 [, _* k& z1 l5 ~7 @$ }2 E7 r
clear;
) S0 y9 [# `/ }+ W& |% bfidin=fopen('title.txt','r');, w/ D- L0 P3 ]" W+ @, p% ^5 |( }' T8 N

% J, Z6 D# ~$ ?2 ?& H0 d: Y/ T! Mfidout=fopen('result.txt','w');7 a- R* m. _) b9 f
7 ?' S/ c6 L9 d1 e- |5 Y7 d0 e( Y
while ~feof(fidin)                  %while ~feof 表示 若 未读到文件末尾 则 继续 循环
, r8 g3 J* x( l8 u    wellname=fgetl(fidin);          %如果没有使用fgetl函数,则feof判断没有作用,这将是一个死循环!
; t0 j, V8 I4 K" f' A: V/ K' V    titleline=strcat(wellname,'.txt');
, m9 z# `& d  X3 j+ ?6 e8 x+ ?4 L    [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(titleline);" W/ R! U/ Q. m" N: }4 E2 }
    efc_rst=[efc_dpt,efc_poro,efc_perm,efc_ratio];( J  z7 _# a- Q3 @  b/ K& l7 p% I
    fprintf(fidout,wellname);
( n" `, ^, Q- I    %fprintf(fidout,'%s %s %s %sn',efc_rst);
% {1 h0 l+ r3 T! _0 C" {/ d    fprintf(fidout,'%8.1f %6.2f %6.2f %6.4fn',efc_rst);
* k$ E- Z+ Z- e8 Y5 ?end' O8 g% S" w) J3 N/ A
fclose(fidin);, t/ O9 w2 b  v8 R
fclose(fidout);
% M* A5 }- s' ?
  w: u( E4 ~9 w: C  j
/ M/ J$ q, u' j5 ^
' r/ \) z" E; }$ g部分文件名(title.txt)
6 d% I; u" D. \) x; G
8 [  X% Z  H( J, _8 ]# w2 X' [5 KB12-B51-58
" s; ?( l2 y' X5 b2 ~B12-B53-58! P; Y* J, m+ U6 E
B12-B55-59
+ V2 `5 c4 @3 R% P& H/ ?B12-B55-62
. ^: V: v5 ]) tB12-B55-64. H6 e8 X9 n! r2 v3 ^9 |
B12-B57-51
2 v0 z- U! ^' r$ H$ d* p- ~. y& ^' `B14-B50-44
  h1 u5 v6 w7 v' a+ D- s" u& aB14-B50-48
9 @/ d# K2 X% x. ^8 EB14-B51-46: V- n* E) n8 `# d
B14-B52-490 F" s8 J3 ]" k$ F
B14-B54-48
$ ~+ p. Y  y1 n. f. B- }+ UB14-B54-53% |# v: q4 r4 \3 o# r
B14-B54-74
+ m2 o5 f) X# \B14-B55-52
3 v# t, T# |3 U7 g) t) D/ E: s8 QB14-B55-56/ M& T: w+ \* t' ~$ T. p2 M  c1 c! N/ D
B14-B55-60
2 |' X$ r3 D! Q! x2 X" HB14-B55-63& T8 e# L) ^: F( H
B14-B55-65
. b; h; y; Q. s+ ~B14-B55-67. P1 K6 q5 K& J
B14-B55-69& E5 X7 a4 \5 K2 @
B14-B55-75
) `, k1 G) u% |B14-B56-49
6 Z, N4 Z8 W; a& v8 s5 @0 BB14-B56-53) R) F9 k* v2 F+ ?7 \" A
B14-B56-70
; R4 U* g, W, c9 t
1 O5 s$ x6 K; K…………+ d9 }* a% h$ A; g

6 o# w0 n; ]8 t + s* B+ u4 H3 r8 @* h4 t5 |8 U
$ |. @7 a' l% [) ~* z
function [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(file)
5 l9 g  K( p: D! F, n5 O, r%读入数据,进行处理,输出结果5 X, _# G/ H  h, }; T
    matdat=load(file);8 ]: {- E5 e9 r0 \* J
    [n,l]=size(matdat);
( S. \5 k* @4 a% k0 S* I2 t   : r4 G: P7 ^/ l8 N' ]2 B
    efc_dpt=0;" `3 c) d$ G% R
    efc_perm=0;
; ^  Z. m$ H9 P( I' H" p    efc_poro=0;
0 L/ D2 S% Z" V' N5 P( _( K. @" s    efc_ratio=0;
9 y. q4 D( b0 V" Q+ @; d   
; U% P  @: T$ ^+ ^% V    for i=1:n-1
) Y" W2 @( b; `# y; m  A5 u! R* A2 d        matdat(i,1)=matdat(i+1,1)-matdat(i,1);! s7 ]( E3 ^. I( q
    end
# R. i" M; k# D8 I3 O   7 a7 u5 l, R( }* p3 K
    for i=1:n-1
7 P: ^! Q( G; e        if matdat(i,3)==11 p) y8 J0 r8 i6 b/ G8 `; k$ I  f
            efc_dpt=efc_dpt+matdat(i,1);
9 B# P% f( y9 M0 t0 [, J7 |            efc_perm=efc_perm+matdat(i,5)*matdat(i,1);
' I: K9 y0 V3 C8 m9 @% l' s9 o( O            efc_poro=efc_poro+matdat(i,4)*matdat(i,1);
" `1 W5 r: ^7 F& @9 f            if matdat(i,2)==0
5 l+ y; u; o1 [5 ~9 c                efc_ratio=efc_ratio+matdat(i,1);, s. F5 S) W" l7 D
            end) |: J/ m5 B  E% ^. k
        end
/ e6 R9 `! t2 p" B; y4 P    end. N" P- a8 b4 u  r- n) B+ L# y
    if efc_dpt==02 \% Q3 ^' Q) p" G5 o, W. v( G
        efc_perm=0;
8 Y; R- E0 r! s' T* [5 ]" h: ?- U$ H% S        efc_poro=0;) H% S8 N# u$ d9 J0 G* z% F# y
        efc_ratio=0;
/ k$ p2 k1 D- n( s. u$ I1 a- O3 z/ }1 V" ~1 q/ I& {" T; ^& W( y  D
    else, v  K2 V) \2 q
        efc_perm=efc_perm/efc_dpt;
7 I) s8 m9 X& ^' r( _/ y6 g; v        efc_poro=efc_poro/efc_dpt;
8 D1 Q' _1 O! @( x! X* A        efc_ratio=efc_ratio/efc_dpt;       ( w6 Q3 }; ?+ T0 _+ V
end& f+ N0 r: O$ n/ d. B2 _" m- d0 A
6 i9 k* e" C! w: Y2 p( p, }4 k+ I
) F! X* q2 H! Z8 W; P" Q" b

2 \5 X9 D; t- }+ M* I2 \井的数据
4 _7 q' @# Q# T
- |5 x2 o- i( ~1865.2 3 0 0 0" S4 P" ]# t5 l
1867.8 0 1 6.8 0.1; t$ ^- A4 u& [) n6 K
1874.4 3 0 0 0+ ^0 a0 n! I% X" d
1885 1 1 3.3 0.02
5 m. g" K3 N' o  r  H2 [6 Q+ K1888.8 3 0 0 09 x2 A/ q" Z" |* p1 Z& x- c. e
1891.8 0 1 2.3 0.03
; a8 y+ `) a. e  E2 l& o0 H  t6 Y1897 3 0 0 0+ [8 g4 p0 W) p# s2 m5 f
1898 0 1 2.3 0.03
! e  j# w8 Y4 e+ ^1903 3 0 0 0" K8 m! A$ T5 N
1906.2 0 1 2.3 0.03& ]$ O* ]8 j3 U" }% T* G! A
1911 3 0 0 00 S+ u) ^% N& s/ J4 m' w
1914.6 1 1 3.4 0.218 d) T4 o# V, n
1919 3 0 0 0
! s/ J0 e8 F; a8 f
- V) o" |$ A7 o. L, e% y, `+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' m6 D' O5 r/ y4 F
$ w7 Z: [7 P; L* B- w2 ]多数据文件批处理的一个技巧( F; X& b$ Q" l. N8 U8 g2 d
. M$ r& ~, X, M, b. L
数据处理过程中,很多时候需要对大批的数据文件进行循环处理。如果文件名是有规律的,那么正常的方法尚可处理,但是碰到文件名没什么规律,或规律不强时,表示出这些文件按名就是一件很头疼的事了。假设现有以下文件需要进行循环处理,以供参考。+ _; d2 A( L' ]9 A
9 f7 O* I" C$ [, i( U8 q. g0 A: C
1、MATLAB + j2 D9 c: m! J  W' p
clc;clear; 5 i' q) B9 z2 B/ u. H" a7 s- O- r
%--将'e:/POP/data/'下的文件信息写入构架数组file_structure
$ g$ J7 o8 ^: \4 J/ S- l: B. mfile_structure = dir('e:/POP/data/');
* S% q4 y8 c7 V%--file_structure.name下是'e:/POP/data/'内的文件名0 r+ I. Q6 V" R' c& V/ B
for i=3:size(file_structure)      3 `% C: j4 r, ~
. V' I5 P) f' ~' ]4 N
  filename = strcat('e:/POP/data/',file_structure(i).name)                 % stract 连接字符串7 {/ P3 `: z' Q6 j! B  B- S' A9 a( N$ U
  f=netcdf(filename,'nowrite');  
8 Z! u" s* U5 C1 l5 @$ n( Q9 `$ M  a=['在此对f及里面的变量操作...']  
( U1 s9 g1 {7 g5 f  close(f)( Z& z  O- ?& z( s
end
" \' E. c2 ^" Z7 }+ d1 ?
! T/ e1 @$ B. D 0 \& ^4 P1 B( @# ]! ?2 I# m
-----------------------------------------------------
6 c# A/ B7 F5 n怎么用matlab读取多个数据文件?
  w* Z$ e, ~' i. t. [4 s2 k& z6 [) x) C0 A2 E  o' S

# D! o9 U! v7 C; v1:如果文件名规则6 Q- Y6 r3 ^. l  _6 E, k) n4 v
6 p: P6 c, a# O3 U& n$ g
$ J: t5 N" ]$ [, [5 `' S
% 文件目录:& q$ Y. S/ \% `* S
* k/ l, P7 ?) k) z; [. o, P: b

) o) P. V/ Y7 i4 X, @. P3 ]3 X. O/ U# f' @my_dir=' /home/my_calculation1/test1/';
; B1 @- J( [/ c- A# |9 [2 x; @5 F. |3 u2 g$ ]7 t, l8 Z

* g4 ?. d9 j3 S( P/ b! |8 p8 _" H) l* P3 J
3 Y  i7 {# l" U( k
4 {, _* k, W" y
%文件名前缀
5 Q/ g( w2 F" i4 b! z! [' Y- }( }0 R, T3 q" t4 O% R
my_pre_T='test';
- F: ^8 _! |  W  s8 G2 J%文件数目 fnum =1:32; %Read files for i=1:length(fnum) filename = [my_dir,prefix_T1 num2str(fnum(i))]; 然后dlmread,fopen等操作就不需详写了!与单个文件一样。
! }, S3 {/ h1 w8 O" H. b! {end, k) X. G* O3 K2 v/ ~' f  f
% U! k! [/ q* M4 y8 }. ~

* J7 y3 Z) O  l7 T' w9 s9 T
# a7 n' U# z  j3 B* ]5 a9 [% V9 B' E0 y+ L8 z, P

+ j( y( Q. @5 A+ e$ d! T, f  d2:文件夹数据批量读取的问题,命名无规则
& B/ t9 L# `4 }在windows下很简单,ls函数便可以得到一个包含所有文件名的字符矩阵。可惜在unix下得到的是个字符行向量。当然,处理下也可以批量读取数据文件,不过不想再写了。因为另外一个函数也可以实现批量处理数据文件的功能。即dir函数+ ]; B( J' Q2 [9 v3 H

/ F$ S' s1 Y0 _LS displays the results of the 'ls' command on UNIX. ! W6 F, w- J5 Z2 s$ E0 P4 o

; K3 D& ?& m- A' q- I5 |) Q/ g" a# C; C% p

4 v' b% p9 w* w0 i. O& L0 [On UNIX, LS returns acharacter row vectorof filenames separated by tab and space characters.8 N4 f- T7 _9 e/ C

- R  y! i, v) M- ~# ]& l) L3 |4 g  y, k6 {0 q2 M

- `  `" i1 x8 c* E
4 i& w' |1 {7 x! T3 J8 T/ u/ }( ]; w* d3 _  ~; E8 R) C

1 u: p) r8 E  M. b5 b1 S3 L1 {" t7 s- ?! n5 {; s4 S2 ?
假定.dat文件在/home/my_calculation1/test1/ 文件夹下,文件名符合matlab变量名的命名规则,要读取第二列的浮点数字为数组并以文件名为变量名。
+ B; q: d: Y" F# q+ E9 j+ o; @' x2 s/ E7 Y% O9 ]3 f0 L2 ~7 {
  i% s, L  @( r" H/ f6 v1 @7 S
% h( {3 d! t& k  S9 m
mydir='/home/my_calculation1/test1/';9 ?# T6 {! C1 n
" n, E' ?5 P; c: L) m
temp1=dir([mydir,'*.dat']);: |, o4 N/ r* _
1 ^# f6 u( `, D6 X1 o, o
$ w" b  ]8 T- k. `' n

/ p4 J7 z' p& T5 M6 L. w- b+ d
; H6 ^% m; j! o  ?9 L2 u. K" {temp=dlmread(filename,'',0,1);; v# N8 W  y; I" \/ D1 Y
6 ?% M! K6 x/ g5 a
' K  U" j% P5 e4 R& o# ^

2 q8 m3 i8 ], ]; ~4 B- }. t5 }+ i9 G$ w3 H9 u

4 f( k7 `" r7 k8 I9 P# G
" j& S' R2 e4 _3 ]8 z4 q7 P1、利用dir(外层文件夹)获取子文件夹;
$ _: r1 X( g3 R$ t2、利用dir(子文件夹)获取子文件夹中的文件信息;
: _( U, Y- o" G7 i1 y# b3、遍历文件,做处理;5 H# V$ K/ c% P5 Z
对于遍历文件夹,也可以使用mathworks网站上的函数dirr轻松搞定。
9 P6 ^" M& h! Z9 R1 k
# ?' F; T$ B+ G* J* E/ F
+ c: b  n. ~' _9 s7 e& U5 L' c/ M+ F. s& G
注意:如果直接使用 temp1=dir(mydir]);读取文件夹下所有文件,应当从第三个开始才是目录下的文件。 另外,使用dir还可以遍历一个文件夹下的所有子文件夹。
& {) u) I) t4 u& ceval_r([temp1(i1).name(1:end-4),'=temp;'])0 X: q2 c# G& ]' a

/ O8 {, U9 n6 u* ~
! S& e0 }# l8 L5 P' ]" Sdlmread,fopen等操作就不需详写了!与单个文件一样。4 y# n. l. l; i0 A) [6 Y) y& T. a
end5 U# D3 o) t6 L. P# }" i, Z

, L- F* X, B4 |3 l( A9 m9 c) s( E0 R+ @4 ^& x6 J* n
: I* T5 B$ x, r9 n, N2 L
6 |" C4 Q# o3 l0 a, w+ k
2 @7 ^  c2 ^) S- }

6 j. i8 j- w' a0 s; l. V- Anum_temp1=length(temp1);
  ~7 t% f, N# f
$ E( ^; G- x" W2 B- N4 J$ e% S
" L! i! D2 r' |: Y, v& F% h5 ?* ~' @8 W/ D

- E; B5 G# p' f2 }+ v& k/ Kfor i1=1:num_temp11 ^% K: g8 N% g8 }! t! r3 ?
* S' l/ b, x( Z9 {6 E) f
1 S5 r) ~" y& ^" ]( A& G
filename=[mydir,temp1(i1).name];
2 S& B% p! [0 A5 y2 B# }7 K6 K/ t0 ^  E3 G
& O8 b9 o  {4 ]

: T% s7 P& m. A5 B; A/ q5 i( ?9 r3 K0 G) |) E  U/ H% u

  d2 v1 p+ Q  x% Y2 _' B+ m0 ?; Y& V0 `
) a: t. s: D# A
, `/ {/ F, V2 e4 Y4 B- `- }5 q" L  q
8 H: |9 j9 B( i  p2 p, t) s( B

/ C' Z3 V  L% w. `: p, C; D$ U& o5 i; _+ s
现在有一个文件夹里面有50个的.dat文件.每个文件大概三万行.两列,第一列是字符串,第二列是浮点数字. 批量读取这个文件夹里的.dat文件的第二列。读取完以后的数组变量名就是.dat的文件名+ t- }" [1 `8 ?- x& C

: D6 y/ h. j9 @( O( n: R: {8 B) d: F. W: f  X- [0 \" G* a8 c# X

! d9 [& ]2 }+ U6 z; W  f3 P# lOn 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.
; E0 u% w+ M3 \. _& `1 C: ^) d/ m0 s

" b* I7 X- K! S; f下面介绍下使用dir函数读取文件夹中文件的程序" w2 L9 H! @4 U! T7 y# r

; c, K5 p- J/ q" ~5 b
9 M/ ]* Y1 |5 f3 D$ R7 |  T2.1 读取所有扩展名为.dat的数据文件,并进行处理。, Q7 q; Y4 N+ v6 L. S$ T

7 t5 c% b% K, k) K3 F5 y) p
* {# {& m, n$ ^matlab中,也可以使用通配符的。下面就来展示下:

该用户从未签到

3#
发表于 2020-3-18 18:23 | 只看该作者
matlab批量读入数据文件的方法

该用户从未签到

2#
发表于 2020-3-17 17:50 | 只看该作者
这个方法不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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