matlab中各种数据的读取.docx
《matlab中各种数据的读取.docx》由会员分享,可在线阅读,更多相关《matlab中各种数据的读取.docx(15页珍藏版)》请在冰豆网上搜索。
![matlab中各种数据的读取.docx](https://file1.bdocx.com/fileroot1/2022-12/30/bc6d54a1-9603-40c0-99e2-67de8f1f1dec/bc6d54a1-9603-40c0-99e2-67de8f1f1dec1.gif)
matlab中各种数据的读取
本技术支持指南主要处理:
ASCII,binary,andMATfiles.
要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令:
helpiofun
MATLAB中有两种文件I/O程序:
highlevelandlowlevel.
Highlevelroutines:
包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。
Lowlevelroutines:
可以更加灵活的完成相对特殊的任务,需要较多的额外编程。
Highlevelroutines包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。
举个例子,如果你有一个包含数值和字母的文本文件(textfile)想导入MATLAB,你可以调用一些lowlevelroutines自己写一个函数,或者是简单的用TEXTREAD函数。
使用highlevelroutines的关键是:
文件必须是相似的(homogeneous),换句话说,文件必须有一致的格式。
下面的段落描述一些highlevelfileI/Oroutines并给出一些例子帮助理解概念。
LOAD/SAVE
主要的highlevelfileI/Oroutines是LOAD 和 SAVE函数。
LOAD
可以读MAT-filedata或者用空格间隔的格式相似的ASCIIdata.SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCIIdata。
大多数情况下,语法相当简单。
下面的例子用到数值由空格间隔的ASCIIfile sample_file.txt :
154168
543268
684321
907876
598123
Example:
用LOADandSAVE读写数据
CODE:
%Loadthefiletothematrix,M:
M=load('sample_file.txt')
%Add5toM:
M=M+5
%SaveMtoa.matfilecalled'sample_file_plus5.mat':
savesample_file_plus5M
%SaveMtoanASCII.txtfilecalled'sample_file_plus5.txt':
savesample_file_plus5.txtM-ascii
UIGETFILE/UIPUTFILE
UIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。
会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。
UIGETFILE让你选择一个文件来写(类似Windows‘另存为’选项?
)。
用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。
两个函数的返回值是所选文件名和路径。
Example:
用UIGETFILE从当前目录选择一个M-file
CODE:
%ThiscommandlistsalltheM-filesinthecurrentdirectoryand
%returnsthenameandpathoftheselectedfile
[fname,pname]=uigetfile('*.m','SampleDialogBox')
注意:
UIGETFILE一次只能选择一个文件。
UIIMPORT/IMPORTDATA
UIIMPORT是一个功能强大,易于使用的基于GUI的highlevelroutine,用于读complexdatafiles。
文件也必须是homogeneous。
IMPORTDATA形成UIIMPORT的功能,不打开GUI。
可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。
下面的例子用到包含几行文件头和文本、数值数据的文件'sample_file2.txt' :
Thisisafileheader.
Thisisfileisanexample.
col1col2col3col4
A 1 4 612.000
B 1 4 613.000
C 1 4 614.000
D 1 4 615.000
Example:
UsingIMPORTDATAtoreadinafilewithheaders,text,andnumericdata
CODE:
%Thisreadsinthefile'sample_file2.txt'andcreatesa
%structureDthatcontainsbothdataandtextdata.
%NotetheIMPORTDATAcommandspecifiesawhitespace
%asthedelimiterofthefile,butIMPORTDATAcanusually
%detectthisonitsown
D=importdata('sample_file2.txt','') %原文有误?
D=importdata('sample_file2.txt')
可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入:
data=D.data
text=D.textdata
可以用UIIMPORT读同一个文件并得到同样的结构.
注意:
对于ASCIIdata,你必须检验导入向导正确的识别了列分隔符。
TEXTREAD/STRREAD
TEXTREAD 是一个强大的动态highlevelroutine,设计用来读ASCII格式的文本和/或数值数据文件。
STRREAD除是从字符串而不是文件读以外,类似于TEXTREAD。
两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。
他们有效的提供给你一个
“两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(highlevelroutines的做法),并且你可以改变他们以匹配你特定的应用(如同lowlevelroutines做到的)。
例子:
CODE:
Example1:
UsingTEXTREADtoreadinanentirefileintoacellarray
%Thiscommandreadsinthefilefft.mintothecellarray,file
file=textread('fft.m','%s','delimiter','\n','whitespace','');
CODE:
Example2:
UsingSTRREADtoreadthewordsinaline
%ThiscommandusesthecellarraycreatedinExample1to
%readineachwordofline28in'file'toacellarray,words
words=strread(file{28},'%s','delimiter','')
CODE:
Example3:
UsingTEXTREADtoreadintextandnumericdatafromafilewithheaders
%Thiscommandskipsthe2headerlinesatthetopofthefile
%andreadsineachcolumntothe4specifiedoutputs
[c1c2c3c4]=textread('sample_file2.txt','%s%s%s%s','headerlines',2)
CODE:
Example4:
UsingTEXTREADtoreadinspecificrowsoftextandnumericdatafromafile
%ThiscommandreadsinrowsBandCofthefile.The'headerlines'
%propertyisusedtomovedowntothedesiredstartingrowandthe
%readoperationisperformed2times
[c1c2c3c4]=textread('sample_file2.txt',...
'%s%s%s%s',2,'headerlines',4)
CODE:
Example5:
UsingTEXTREADtoreadinonlythenumericdatafromafilecontainingtextandnumbers
%Thiscommandreadsinonlythenumericdatainthefile.The
%'headerlines'propertyisusedtomovedowntothefirstrow
%ofinterestandthefirstcolumnoftextisignoredwiththe
%'*' operator
[c2c3c4]=textread('sample_file2.txt','%*s%d%d%f','headerlines',3)
DLMREAD/DLMWRITE/CSVREAD
DLMREAD 和 DLMWRITE函数能够读写分隔的ASCIIdata,而不是用lowlevelroutines。
他们比lowlevelroutines容易使用,Lowlevelroutines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。
CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。
当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。
以'sample_file.txt'为例:
CODE:
Example1:
UsingDLMREADtoreadinafilewithheaders,text,andnumericdata
%Thisreadsinthefile'sample_file2.txt'andcreatesamatrix,D,
%withthenumericdatathiscommandspecifiesawhitespaceasthe
%delimiterofthefile
D=dlmread('sample_file.txt','')
CODE:
Example2:
UsingDLMREADtoextractthefirst3columnsofthelast3rows
%Thisreadsinthefirst3columnsofthelast3rowsof
%thedatafile'sample_file.txt'intothematrix,D_partial.
%读文件'sample_file.txt'前3列后3行,到矩阵D_partial.
D_partial=dlmread('sample_file.txt','',[2042])
CODE:
Example3:
UsingDLMWRITEtowriteacommadelimitedfile
%Thiscreatesafilecalled'partialD.txt'thatconsistsof
%thefirst3columnsofthelast3rowsofdatawhereeach
%elementisseparatedbyacomma
dlmwrite('partialD.txt',D_partial,',')
注意:
保证DLMREADandDLMWRITE指定范围的指标从0开始,而不是从1开始。
WK1READ/WK1WRITE
WK1READ 用来读Lotus123电子数据表文件的数据;WK1WRITE用来写矩阵到Lotus123电子数据表文件。
XLSREAD
XLSREAD用来读Excel的数值和文本数据。
三.具体例子分析:
Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?
以下结合几个示例给出一些总结,大家举一反三就可以了:
1.纯数据(列数相同):
源文件:
CODE:
03866.1622198.938141.140
13741.1392208.475141.252
23866.2002198.936141.156
33678.0482199.191141.230
43685.4532213.726141.261
53728.7692212.433141.277
63738.7852214.381141.256
73728.7592214.261141.228
83748.8862214.299141.243
93748.9352212.417141.253
103733.6122226.653141.236
113733.5832229.248141.223
123729.2292229.118141.186
解答:
对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。
2.字段名(中、英文字段均可)+数据:
源文件:
CODE:
CH0CH1CH2CH3
0.0001230.0003250.0003780.000598
0.0009860.0002560.0002450.000698
解答:
由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上Inf或NaN),故直接使用importdata便可。
3.注释(含有独立的数字串)+数据(列数相同):
问题:
这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件
源文件:
CODE:
Group2 12.02.2006 Limei
Samplesofdatas:
50000
CH0 CH1 CH2 CH3
0.000123 0.000325 0.000378 0.000598
0.000986 0.000256 0.000245 0.000698
目标文件:
CODE:
Group212.02.2006Limei
Samplesofdatas:
50000
CH0CH1
0.0001230.000325
0.0009860.000256
解答:
由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata,load等高级命令直接读取会失败,用textread,dlmwrite等格式化命令也不太合适,因此只能使用低级命令进行读取。
(当然了,可以跳过注释部分直接用高级命令读取数据,即:
[abcd]=textread(filename,'%f%f%f%f','headerlines',4);)。
一个简单的、非通用的包含注释的读取方法如下:
-------------------------------------转---------------------------------------------------------------------------------------
CODE:
clc;clear;
fid=fopen('exp.txt','r');
fid_n=fopen('ex.dat','w');
while~feof(fid)
tline=fgetl(fid);
if~isempty(tline)
ifdouble(tline
(1))>=48&&double(tline
(1))<=57 %数值开始
a=strread(tline);
a(3:
4)=[];
fprintf(fid_n,'%f%f\n',a);
cleara;
elseifdouble(tline
(1))==67 %字母C开始
[b1,b2,b3,b4]=strread(tline,'%s%s%s%s');
b=[b1{1},' ',b2{1}];
fprintf(fid_n,'%s\n',b);
clearbb1b2b3b4;
else
fprintf(fid_n,'%s\n',tline);
end
else
fprintf(fid_n,'%s\n',tline);
end
end
fclose(fid);
fclose(fid_n);
---------------------------------------------------------------------------------
4.注释(不含独立的数字串)+数据(列数相同):
源文件:
CODE:
你好abc
欢迎来到我们
振动论坛
1111111111
2222222222
3333333333
4444444444
5555555555
解答:
直接用importdata便可
注:
有时候注释中含有独立的数字串也可以importdata成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。
5.注释与数据混排:
对此当然只能自己编程,举例:
源文件:
CODE:
1111111111
你好
2222222222
欢迎来到
3333333333
振动论坛
4444444444
5555555555
解答:
--------------------------------------------转--------------------------------------
CODE:
function[data]=distilldata(infile)
%功能说明:
%将保存数据的原始文件中的数值数据读入到一个data变量中
%使用说明:
%infile——原始数据文件名;
%data=数据变量
tmpfile='tmp2.mat';
fidin=fopen(infile,'r');%打开原始数据文件(.list)
fidtmp=fopen(tmpfile,'w');%创建保存数据文件(不含说明文字)
while~feof(fidin)%判断是否为文件末尾
tline=fgetl(fidin);%从文件读入一行文本(不含回车键)
if~isempty(tline)%判断是否空行
[m,n]=size(tline);
flag=1;
fori=1:
n%判断一行中有没有字符(+-.Ee和空格键除外)
if~(tline(i)==''|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'...
|tline(i)=='e'|tline(i)=='+'...
|(double(tline(i))>=48&&double(tline(i))<=57))
flag=0;
break;
end
end
ifflag==1%如果是数字行,把此行数据写入文件
fprintf(fidtmp,'%s\n',tline);
end
end
end
fclose(fidin);
fclose(fidtmp);
data=textread(tmpfile);
delete(tmpfile);
---------------------------------------------------------------------------------------------------------
另外,如果要求不高,也可以使用textread函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释)
6.各列数据的分离:
源文件:
CODE:
0+ 47038.7 1.05 09:
26:
07 C
2+ 46477.7 1.03 09:
28:
38 C
4+ 44865.7 1.04 09:
28:
48 C
6+ 41786.4 1.03 09:
28:
56 C
8+ 39896.0 0.97 09:
29:
03 C
10+ 37518.4 0.93 09:
29:
15 C
12+ 35858.5 0.92 09:
29:
30 C
14+ 46105.0 1.03 09:
30:
21 C
16+ 46168.6 6.89 09:
30:
30