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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
网上搜集的几个代码,很有用,保存。+ h5 l* K1 @2 x" X  W7 |2 E. e

& n7 w6 B1 c" Q0 d/ l4 H++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
: G, z0 q, ^# P) F# B' b
: q6 n! L# W, @2 u+ c( N  Q1)要读入的文件下的文件名称依序列的方式命名,如a1b.mat, a2b.mat,...,ajb.mat,...9 o( h4 ]6 B0 d

7 T# O6 H. ?% b2 C7 v   循环读入
8 x# f2 ]: w- l) T' |1 I6 I/ D! ?- |1 F. W# b( j4 t: y
   filepath='';%文件夹的路径8 l( ]. L( K* ?: h, L0 b

6 N4 p6 X. ~- p% e4 q9 n$ I   for i=1:n  %n是要读入的文件的个数
; B9 L" }' H2 ^& V" V9 K
$ E! Y4 r9 H: o+ W6 K* X       load([filepath 'a' num2str(i) 'b' '.mat'])
) {7 b/ ?1 e2 z% {) _
' A2 b+ `& A3 P4 o  s. Q% B/ o   end
. `5 B, u! T+ E. S
- V; `" M: h+ T- O: J6 `& n - B6 _5 L3 |0 i0 M- g1 j: \$ ]
7 a- B0 T$ o! q( q' d
2)文件夹下的文件名称无规律& Z! j, a3 L" S1 A5 }3 b( |

; `$ |- ?0 S& e* M( V9 i4 N0 |    如,文件夹里是n幅图像(.jpg) 和一些数据(其他类型),现在要读出所有的图像
! ]6 R* H9 @% f5 S3 E/ s9 ?' D/ `+ q6 t' W* f4 i
     a,先得到文件路径- @4 s7 ]' l5 b: ?) S* N: g
        di = dir('文件路径*.jpg');
$ t8 u% o, r+ g% j! f( X     b,读入: H% a$ G: d" |6 k
       for k= 1:length(di)
/ l  z0 e3 E/ @$ G% G           I(k,:,: ) = imread(['文件路径',di(k).name]);6 k: i$ Y5 S7 w9 H3 l
       end
! @+ }9 t3 C7 ?) k, |+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9 d2 ^2 `5 g# I. t- |
主程序:
( M9 w# g" `% e" Q9 Z8 V2 Y5 j+ r
4 ]& |7 z+ S! P
5 G: c5 Q5 d: }. `$ {: ?$ x. R6 E, r8 m0 t; |3 E
clc;
% \* x  Y" c: b4 P! vclear;
* j( e( s5 S7 a& c' d. N5 Wfidin=fopen('title.txt','r');
. G1 E/ y9 }) `. W* C
6 E% d# h. l* H+ F5 T0 ^: m) r" I0 g( Lfidout=fopen('result.txt','w');: a/ ?1 U/ y7 a$ `* L' n: R, F
$ H1 i8 z" X5 N8 \# k
while ~feof(fidin)                  %while ~feof 表示 若 未读到文件末尾 则 继续 循环8 ?4 L2 M2 K: F: l; e, C' d
    wellname=fgetl(fidin);          %如果没有使用fgetl函数,则feof判断没有作用,这将是一个死循环!% \+ J' l  x% B7 G; X+ R6 z% h
    titleline=strcat(wellname,'.txt');
  F3 o; l) l. Q; O8 d  L    [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(titleline);
  u; A$ J2 u5 z7 L- m* H    efc_rst=[efc_dpt,efc_poro,efc_perm,efc_ratio];
& U! @0 j( M8 ?' w$ ~" T4 [+ x    fprintf(fidout,wellname);
9 O, V4 b' s6 H7 e9 x. d    %fprintf(fidout,'%s %s %s %sn',efc_rst);) N2 v' s* s3 z5 W) i
    fprintf(fidout,'%8.1f %6.2f %6.2f %6.4fn',efc_rst);
: o* O. a- e5 ?. g! w* d# Nend
: O* L* P# x+ L" X6 c- ]" K7 f6 `fclose(fidin);
' R( y, c8 A! @fclose(fidout);
* C$ l' H4 J& C( w, O
1 f; N6 S4 r2 \, s6 s ( R+ }6 L% J' V! M3 J
; j. \6 Q: _1 X
部分文件名(title.txt)3 g1 e6 c; Y! h
& U; \6 E" s2 N# C3 Z4 \
B12-B51-58  p7 M" _/ g7 x+ X! Z2 `
B12-B53-584 b$ I, F4 A* A
B12-B55-595 G6 i8 \: C8 {/ K' u3 {2 N
B12-B55-62* f0 h7 ^9 `: z, U" b1 M4 W, h! n  u% R
B12-B55-643 L( O; B0 n2 I- u
B12-B57-51! `9 {$ a" B% ]+ R, h. T; Q
B14-B50-44" W& v5 x- ]; W# l+ B1 L
B14-B50-48
/ C" L- d2 b1 GB14-B51-46
  u- O8 T2 ]/ U/ P# ZB14-B52-49
! x) n- V( v& G9 x: h% X) mB14-B54-48
* u+ N0 M7 v; n0 [( k, b. Y1 A! HB14-B54-53
" S3 `3 `0 s+ ?" W6 s7 C1 ~B14-B54-74+ t, D5 `: b9 v3 C$ U
B14-B55-52
: _( N; c) m, o. z) NB14-B55-561 g9 ]8 i9 |& ]# R+ Q
B14-B55-609 k! Q; s6 t* s, @3 j, z
B14-B55-636 z. i1 B' `$ R
B14-B55-65
) `! Y! |, _3 b; n) TB14-B55-67* f- ]* T& J5 f% ~$ N# T. d. |
B14-B55-69' N1 H& ^4 }+ V# r: e5 z( Q
B14-B55-75/ f/ ]4 u7 g6 s0 @! }: ~* @* J7 K
B14-B56-49; b( W$ X6 |# A5 d' Z  c" u
B14-B56-530 O6 v2 C0 X' ^& j3 T
B14-B56-703 g7 u1 q, {- @- |9 K- H

! ?+ ?5 p6 k5 O7 D- P…………
  ~' u  f8 s2 C( `/ t8 P4 ?- M! y, P$ R2 |# V* [! D5 T: Z
; e' S: f8 y. L# T* M
6 [+ T" _: y8 ?+ n6 T
function [efc_dpt,efc_poro,efc_perm,efc_ratio]=numprocessor(file)
  z4 a% o: O' ~: K  j0 _%读入数据,进行处理,输出结果) E* p2 C! c# l; H5 ~1 Q
    matdat=load(file);
8 T8 u  e  z) g$ s9 i; A    [n,l]=size(matdat);
+ b9 h! o+ E! @1 t2 ~( A1 w$ @7 y8 V   4 R. P6 E* \2 x! n* }
    efc_dpt=0;
/ B6 t' M8 B; p, G$ v* C    efc_perm=0;% }. U5 p* A4 d3 @* v
    efc_poro=0;
. I1 C) Q3 h1 C4 i    efc_ratio=0;1 w$ n' X7 M& K) H- L: k
   
+ n. [8 J' \; V* c+ Q    for i=1:n-1
! ~* m+ J% I9 _; D/ A+ r        matdat(i,1)=matdat(i+1,1)-matdat(i,1);0 m, ]* _3 ]6 l/ _! I( t. k
    end
/ f* a& }- x+ u! E   
4 m: f& E, f) H; i6 e+ |& M1 y    for i=1:n-1; K" g2 u0 \, c% M9 e' m' Y3 [/ H" k; S% m
        if matdat(i,3)==1* l4 }9 }( g. t/ L+ x/ V
            efc_dpt=efc_dpt+matdat(i,1);
5 \! W/ j9 F! y            efc_perm=efc_perm+matdat(i,5)*matdat(i,1);, F& S4 M0 [6 Q# I4 E. T# `
            efc_poro=efc_poro+matdat(i,4)*matdat(i,1);' S$ L9 {9 n. m, ?+ w5 R
            if matdat(i,2)==0+ }  X/ Y' L4 {) z% U
                efc_ratio=efc_ratio+matdat(i,1);
2 n, r. ?( q+ m; h2 j% E  |            end
. y) Q6 H! r6 t* f- Q, X& Z        end, L3 A/ p& `) x2 ?4 H, A
    end
6 t* g7 t0 ~- e  v, e# d- ?    if efc_dpt==0( j1 ?2 j8 X" c6 H& _4 A
        efc_perm=0;6 v, S: Z1 v4 m. j9 Q8 z! V" \
        efc_poro=0;3 |1 t0 S# M) r3 r+ w0 q/ g
        efc_ratio=0;
9 ]& I1 B1 d  E$ b2 h0 ?# H$ o' @( a: _' t: p
    else1 b1 {* }% ]' \# W9 D; O
        efc_perm=efc_perm/efc_dpt;; ^( w2 Y. ]- s4 k' ?7 m
        efc_poro=efc_poro/efc_dpt;
! M3 ]' H% @2 p+ d! \/ I0 N        efc_ratio=efc_ratio/efc_dpt;      
* r! \. U- [2 f2 Z2 D! L6 ?end8 @* C6 A% ~5 J# ]' s! Y/ F, O" s

& F: d5 Q, g0 D9 @9 z1 G: v
7 ?- |! t0 w' b* n" {/ a" R: P$ R# D7 {: `
井的数据4 s' g( }$ ?; c8 D+ U7 l8 a: j

6 H. u1 j2 B" r6 B& r2 I% u+ i1865.2 3 0 0 09 c5 C2 X$ G6 h+ o
1867.8 0 1 6.8 0.1
- Q7 L$ n& _" r  ~. x1874.4 3 0 0 0( [# e- J3 b  q$ e% _
1885 1 1 3.3 0.02  E. ?" z# Y& T; m
1888.8 3 0 0 02 a8 k2 v" h0 p' M2 E; O; D3 B
1891.8 0 1 2.3 0.037 q, i% _$ c, ^9 D6 [* V
1897 3 0 0 0
+ s2 Y2 z; h& d- ]7 U, P" D' D* C1898 0 1 2.3 0.03
, Q* h5 \9 ~  M/ ~: P1903 3 0 0 0
. R; e% l4 p2 r8 R: W4 |1906.2 0 1 2.3 0.03( Q* E$ h$ o( e0 M
1911 3 0 0 0
$ [& m0 p- G: [1914.6 1 1 3.4 0.21
$ p" o" D2 l6 S, N* T% g1919 3 0 0 0
* |9 J2 R  j: X9 y& M0 C3 y; y; z. {7 ^1 Q# Q
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3 h) g' g, f! s( Q
8 M" h9 e0 j$ U! o; Z4 A. O1 D1 s
多数据文件批处理的一个技巧
" {5 Z) w; H3 z  I
( T# e+ ^: [9 Q数据处理过程中,很多时候需要对大批的数据文件进行循环处理。如果文件名是有规律的,那么正常的方法尚可处理,但是碰到文件名没什么规律,或规律不强时,表示出这些文件按名就是一件很头疼的事了。假设现有以下文件需要进行循环处理,以供参考。2 l2 T1 {2 U! I4 ?% u
, [3 m/ E- b3 [) U) q
1、MATLAB
+ H3 @" |1 {. x, Vclc;clear;
( ~* W) l$ Z: B! e( b- T%--将'e:/POP/data/'下的文件信息写入构架数组file_structure/ S9 h* ^1 Z6 c& }% j5 r
file_structure = dir('e:/POP/data/'); , s, T4 B3 A$ E5 |3 Y7 x
%--file_structure.name下是'e:/POP/data/'内的文件名
7 G9 o; |( e' F0 c8 @$ x; bfor i=3:size(file_structure)      4 ~/ }- `& X; G
$ t7 T8 b$ i; ^9 P7 Z. Z. ^' @; {# ]
  filename = strcat('e:/POP/data/',file_structure(i).name)                 % stract 连接字符串" A" l/ P; T) ^0 F$ p8 ~4 {& T
  f=netcdf(filename,'nowrite');  1 ?5 p5 ~$ R& o( f6 B* p) K; W
  a=['在此对f及里面的变量操作...']  
) I! Q2 w7 }+ I9 m  close(f)1 w: q' J. K) f, O
end
$ w- E2 [1 j9 {7 k( x$ f+ I
% G: l& i* p1 w" \" T
1 {7 w* c4 X$ R7 q2 [ -----------------------------------------------------
: D* U* h7 U  ^. a怎么用matlab读取多个数据文件?$ W1 T" l" R, M+ I, f. Y& n- A

* Y8 r( S3 a- Q' m# e: K3 l: e6 I$ i% \
1:如果文件名规则3 o5 ]. i- g% `; k1 ~" b
' {9 h; ?  [# f2 [# ^. x/ D8 z
; O0 G- {  b& o3 K
% 文件目录:( k; g' A5 F) J9 K
& E) g; m. S# H4 M
% K8 m) a' l5 B4 n; Z# G
my_dir=' /home/my_calculation1/test1/';' p' ]/ o) Q/ \! I& R! @8 ^- [
2 f. H8 @; _' ?1 V
- J4 J) K  u* T2 f
) s* x7 F0 T8 L# M$ t
8 j9 X! t5 u1 {" J  a# b

. H) o0 f) L- L! x%文件名前缀
8 o! {& L/ q- @  g3 n: G# ]9 C4 @
my_pre_T='test';
+ U- b) d2 ]% v4 k8 }& U%文件数目 fnum =1:32; %Read files for i=1:length(fnum) filename = [my_dir,prefix_T1 num2str(fnum(i))]; 然后dlmread,fopen等操作就不需详写了!与单个文件一样。- K2 z+ x- }: f  x2 G" w
end
2 y& \  i: X: e8 @- Q+ v* W! \% |! W# K! z: x
- S: K" x4 @" m" k

; b+ j; G' k, K+ ]4 A
0 d  C3 E) E( W3 E8 \9 C' Z! J
- p5 ~0 ^6 `. A6 I9 G2 j2:文件夹数据批量读取的问题,命名无规则
7 f; h! `2 a/ @/ }在windows下很简单,ls函数便可以得到一个包含所有文件名的字符矩阵。可惜在unix下得到的是个字符行向量。当然,处理下也可以批量读取数据文件,不过不想再写了。因为另外一个函数也可以实现批量处理数据文件的功能。即dir函数8 u* N* H7 K: i1 O. }7 \3 G. }
$ T" |, M  ^, K+ O3 Y3 h
LS displays the results of the 'ls' command on UNIX.
3 T" M# |4 q$ @0 z! `# a# F' o/ I/ K

% v- d9 u3 `$ S6 x$ d" g( g2 H7 Z$ S. q- J: o+ O
On UNIX, LS returns acharacter row vectorof filenames separated by tab and space characters.
, G# c) e  [, K6 Z( j8 M" O
, b1 _0 D' q* I% C6 h3 R
  R3 }9 z! O5 o3 V7 Q. G: t! [
: g# ?/ z! J/ t$ B8 c) I/ R
8 u4 R5 j! ~  [: j$ @9 `; [) Q) ?3 I# W3 O' r* f. J

3 x+ k" P. z. t& Q6 v7 _3 u: b! k8 y# y2 e% M
假定.dat文件在/home/my_calculation1/test1/ 文件夹下,文件名符合matlab变量名的命名规则,要读取第二列的浮点数字为数组并以文件名为变量名。' @( ?& }: p2 ?, `
9 F: k. j: Z" G' ^) t$ ], n
/ r" a  |! t8 G6 U2 L% l2 X5 M
1 M. i" |3 E5 I5 a
mydir='/home/my_calculation1/test1/';
+ l) k0 @, _+ D9 i6 M
5 g9 n# E; z9 c0 ~temp1=dir([mydir,'*.dat']);" f6 y8 ^& z0 H7 ^  ?, ?
8 I/ C- F$ t3 J4 ]2 \& S
0 e1 V) i& Q  Q( j
: g5 l3 @$ C6 }; C. ?/ s
! R' P2 t% \+ f# ~: Z# P+ E: |, C% |
temp=dlmread(filename,'',0,1);3 |* P4 q8 x# i+ X

* D/ g5 ]. }# _! J5 d4 i- O
+ c4 m- v% S3 b( c3 v. b" M7 s0 K5 O; |1 U6 U2 U7 W# S

$ }' O, b" i* F- `+ _! W! @' z+ s- }5 ^
! e( g. @* r8 {* c4 j4 p& b
1 x& ^, I1 n- y( d) o! }( f7 V1 z1、利用dir(外层文件夹)获取子文件夹;( _( y( B. F9 E* a
2、利用dir(子文件夹)获取子文件夹中的文件信息;) k7 B- K( ^1 v
3、遍历文件,做处理;
2 o" w' g8 o: N2 x! P* p- n9 r6 w对于遍历文件夹,也可以使用mathworks网站上的函数dirr轻松搞定。5 j( E* W1 F2 o' J) u

4 N6 D! w" e% @& h* }$ f- P( z
% m: s  x5 p1 L, [) P2 Z, g1 }  l4 B2 Q3 E* V; t8 v" n& C
注意:如果直接使用 temp1=dir(mydir]);读取文件夹下所有文件,应当从第三个开始才是目录下的文件。 另外,使用dir还可以遍历一个文件夹下的所有子文件夹。3 A: {- B* k% E8 @
eval_r([temp1(i1).name(1:end-4),'=temp;']), }6 o: Z# N& X9 W; n- x. x1 U
$ C) d. Q$ V0 \3 F! O
7 L& N+ P3 M; `9 Q% f; Q
dlmread,fopen等操作就不需详写了!与单个文件一样。
  p; W; _0 P4 K6 T; E, y+ hend6 w" P, i/ ?' K" T

& w  s8 w7 N4 L5 T) I! f9 q  o3 d; Y

2 c% P+ F% n' t5 S% \8 m3 |9 W, B  g
8 _, ~; u; e9 t- O
3 ^$ \/ l' c& W4 `: p
num_temp1=length(temp1);
5 m/ q+ e. N5 S  G7 c( d& h) U4 a% D4 _. v% `( Q7 g

: b$ T4 N0 o% ?" f: z: _6 N; L: v- i% ?2 S# a6 |2 L
  \& B  `8 s* `& Q1 T' Y
for i1=1:num_temp15 f% I3 b0 B* @$ |4 h! P6 Z- m9 p

$ W0 S5 v4 V0 o, ~
% h( Q0 m/ k* }. z$ M  m+ P7 `; Qfilename=[mydir,temp1(i1).name];+ R4 @* q0 `7 H% e. U5 m
5 t1 C: e9 y1 r" x

( G# j6 g( O0 ]
/ h, \: N! U6 I0 i" k% `. I; R0 H9 t+ p1 d! X

* t6 f! n( i! S! o- }
9 F1 {: m9 D( ~8 i# B/ N5 D
, C* B) b' q' L. G
& F, J) @( @5 a  u1 E/ Y# @" g6 _: Q

/ y8 A% e3 F0 V6 \: p% O
+ ?5 J8 E. G* m; Q; o/ j5 e; F现在有一个文件夹里面有50个的.dat文件.每个文件大概三万行.两列,第一列是字符串,第二列是浮点数字. 批量读取这个文件夹里的.dat文件的第二列。读取完以后的数组变量名就是.dat的文件名
* s# [4 w* m1 W4 |8 m; x* x& i/ Y5 D3 o% x2 t

4 n" @, X. F3 x2 d
$ B# S. |4 u: W& e% sOn 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.
1 p' `' Z* X' V  K  x3 V# ^4 K! R5 q3 u& w" X' ?% M

* s+ |+ T0 n5 }3 t7 D# |下面介绍下使用dir函数读取文件夹中文件的程序
4 Y' U+ s  W) C) _3 J6 `# R( k) k* F& |, ^
7 F9 X- G( G6 [
2.1 读取所有扩展名为.dat的数据文件,并进行处理。
- e% j/ `: z& t4 u) s
1 y, W. _" ?; ?8 T( c, u" y0 X) j
2 V6 P1 z. L7 [9 Umatlab中,也可以使用通配符的。下面就来展示下:

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-2 09:58 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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