Matlab学习系列011 数据的读写导入及导出.docx
《Matlab学习系列011 数据的读写导入及导出.docx》由会员分享,可在线阅读,更多相关《Matlab学习系列011 数据的读写导入及导出.docx(14页珍藏版)》请在冰豆网上搜索。
![Matlab学习系列011 数据的读写导入及导出.docx](https://file1.bdocx.com/fileroot1/2023-1/4/11379724-5284-41bf-8eba-9b737b2e0dbf/11379724-5284-41bf-8eba-9b737b2e0dbf1.gif)
Matlab学习系列011数据的读写导入及导出
011.数据的读写、导入及导出
在编写一个程序时,经常需要从外部导入数据,或者将程序运行的结果保存为文件。
一、*.txt或*.dat数据的导入与导出
1.load函数——数值数据(格式一致)导入
注:
load函数可以导入.mat文件,也可以导入变量Load(‘1.mat’,’y’)
例1.‘examp01.txt’文件如下:
1.6218e-0056.0198e-0054.5054e-0058.2582e-0051.0665e-0058.6869e-005
7.9428e-0052.6297e-0058.3821e-0065.3834e-0059.6190e-0058.4436e-006
3.1122e-0056.5408e-0052.2898e-0059.9613e-0054.6342e-0073.9978e-005
5.2853e-0056.8921e-0059.1334e-0057.8176e-0067.7491e-0052.5987e-005
1.6565e-0057.4815e-0051.5238e-0054.4268e-0058.1730e-0058.0007e-005
代码:
x1=load('examp01.txt');
%用load函数载入文件examp01.txt中的数据
x1=load('examp01.txt','-ascii');
%用-ascii选项强制以文本文件方式读取数据
load('examp01.txt');%载入数据给变量examp01
运行结果:
x1=1.0e-004*
0.16220.60200.45050.82580.10660.8687
0.79430.26300.08380.53830.96190.0844
0.31120.65410.22900.99610.00460.3998
0.52850.68920.91330.07820.77490.2599
0.16570.74810.15240.44270.81730.8001
例2.‘examp02.txt’文件如下:
9.55502.7027,8.6014;5.6154*3.4532
0.92230.9284,1.4644;3.6703*2.2134
5.55577.2288,4.3811;6.4703*4.7856
4.72719.9686,6.1993;9.6416*0.6866
代码:
x1=load('examp02.txt')
%用load函数载入文件examp02.txt中的数据
x1=load('examp02.txt','-ascii');
%用-ascii选项强制以文本文件方式读取数据
运行结果:
x=
9.55502.70278.60145.61543.4532
0.92230.92841.46443.67032.2134
5.55577.22884.38116.47034.7856
4.72719.96866.19939.64160.6866
2.dlmread函数——有统一分隔符的数值数据导入
语法:
M=dlmread(‘文件名’,‘分隔符’,‘读取范围’)
例3.(带标题行)‘examp03.txt’文件如下:
这是2行头文件,
你可以选择跳过,读取后面的数据。
1.096975,0.635914,4.045800,4.483729,3.658162,7.635046
6.278964,7.719804,9.328536,9.727409,1.920283,1.388742
6.962663,0.938200,5.254044,5.303442,8.611398,4.848533
代码:
x=dlmread('examp03.txt',',',2,0);
%调用dlmread函数读取文件examp02.txt中的数据,用逗号(',')作分隔符,设定读取的初始位置:
2行0列之后的数据
运行结果:
x=
1.09700.63594.04584.48373.65827.6350
6.27907.71989.32859.72741.92031.3887
6.96270.93825.25405.30348.61144.8485
例4.‘examp04.txt’文件如下:
1.455390+1.360686i,8.692922+5.797046i,5.498602+1.449548i,8.530311+6.220551i
3.509524+5.132495i,4.018080+0.759667i,2.399162+1.233189i,1.839078+2.399525i
4.172671+0.496544i,9.027161+9.447872i,4.908641+4.892526i,3.377194+9.000538i
代码:
x=dlmread('examp04.txt')
%调用dlmread函数读取的复数矩阵
运行结果:
x=
1.4554+1.3607i8.6929+5.7970i5.4986+1.4495i8.5303+6.2206i
3.5095+5.1325i4.0181+0.7597i2.3992+1.2332i1.8391+2.3995i
4.1727+0.4965i9.0272+9.4479i4.9086+4.8925i3.3772+9.0005i
例5.‘examp05.txt’文件如下:
1.7587447.2175804.7348601.527212
3.4112466.0738921.917453
7.3842682.428496
9.174243
代码:
x=dlmread('examp05.txt')
x1=load('examp05.txt')%由于列数不一致,会报错
运行结果:
x==
1.75877.21764.73491.5272
3.41126.07391.91750
7.38432.428500
9.1742000
3.dmlwrite函数——将矩阵数据写入指定分隔符的ASCII格式文件
语法:
dlmwrite(‘文件名’,‘数据’,‘分隔符’,‘起始行’,‘起始列’)
dlmwrite(‘文件名’,‘数据’,'-append')
'-append'——表示将矩阵数据写到文本末尾,若不指定将覆盖原文本数据。
例.(略)
4.importdata函数——导入带表头的txt或xls数据【将数据存入‘结构体’】
语法:
A=importdata(‘文件名’,‘分隔符’,‘n’);
N——表示n行表头
注:
也可以读入图片【x=importdata('tupian.jpg');image(x);】
例6.‘examp06.txt’文件如下:
Day1Day2Day3Day4Day5Day6Day7
95.0176.2161.5440.575.7920.281.53
23.1145.6579.1993.5535.2919.8774.68
60.681.8592.1891.6981.3260.3844.51
48.6082.1473.8241.030.9927.2293.18
89.1344.4717.6389.3613.8919.8846.60
代码:
x=importdata('examp14.txt','',1)
x.data
x.textdata
运行结果:
x=data:
[5x7double]
textdata:
{'Day1''Day2''Day3''Day4''Day5''Day6''Day7'}
colheaders:
{'Day1''Day2''Day3''Day4''Day5''Day6''Day7'}
ans=
95.010076.210061.540040.57005.790020.28001.5300
23.110045.650079.190093.550035.290019.870074.6800
60.68001.850092.180091.690081.320060.380044.5100
48.600082.140073.820041.03000.990027.220093.1800
89.130044.470017.630089.360013.890019.880046.6000
ans=
'Day1''Day2''Day3''Day4''Day5''Day6''Day7'
例7.‘examp07.xls’(Sheet1)文件如下:
代码:
x=importdata('examp07.xls')
x.data.Sheet1
x.textdata.Sheet1
运行结果:
x=data:
[1x1struct]
textdata:
[1x1struct]
ans=
1601016010101NaN06363
2601016010102NaN07373
3601016010103NaN000
4601016010104NaN08282
5601016010105NaN08080
ans=
'序号''班名''学号''姓名''平时成绩''期末成绩''总成绩''备注'
'''''''陈亮'''''''''
'''''''李旭'''''''''
'''''''刘鹏飞''''''''缺考'
'''''''任时迁'''''''''
'''''''苏宏宇'''''''''
5.textread与textscan函数——它们用法类似,导入混合格式文本
注意:
使用textscan之前,必须先用fopen打开要读入的文件。
语法:
C=textscan(fid,'format',N,'param',value);
fid——文件句柄;
format——读取格式;
N——用该格式读取N次数据;
'param',value——(可选)指定分隔符和值对
例8‘examp08.txt’文件如下:
(将数据存入元胞数组)
SallyLevel112.34451.23e10infNanYes5.1+3i
JoeLevel223.54609e19-inf0.001No2.2-.5i
BillLevel334.90122e510100No3.1+.1i
代码:
fid=fopen('examp08.txt','r');
C=textscan(fid,'%s%s%f32%d8%u%f%f%s%f');
fclose(fid);
C{1}
C{9}
运行结果:
C{1}=
'Sally'
'Joe'
'Bill
C{9}=
5.1000+3.0000i
2.2000-0.5000i
3.1000+0.1000i
例9‘examp09.dat’文件如下(读入固定格式的文件的第一行,忽略其中的浮点值):
SallyLevel112.3445Yes
book.iLoveM
代码:
fid=fopen('examp09.dat','r');
[names,types,y,answer]=textread('examp09.dat',...
'%9c%6s%*f%2d%3s',1)
fclose(fid);
运行结果:
names=SallyLev
types='el1'
y=45
answer='Yes'
二、*.xls数据的导入与导出——xlsread函数
1.从*.xls导入数据
语法:
[num,txt,raw]=xlsread('文件名.xls','工作表','数据范围')
例10‘examp10.xls(Sheet1)’文件如下(导入Sheet1的A1至H4数据):
代码:
[num,txt,raw]=xlsread('examp02_14.xls','Sheet1','A1:
H4')
%数据返回num;文本返回txt;不处理直接作为元胞返回raw
运行结果:
num=
1601016010101NaN06363
2601016010102NaN07373
3601016010103NaN000
txt=
'序号''班名''学号''姓名''平时成绩''期末成绩''总成绩''备注'
'''''''陈亮'''''''''
'''''''李旭'''''''''
'''''''刘鹏飞''''''''缺考'
raw=
'序号''班名''学号''姓名''平时成绩''期末成绩''总成绩''备注'
[1][60101][6010101]'陈亮'[0][63][63][NaN]
[2][60101][6010102]'李旭'[0][73][73][NaN]
[3][60101][6010103]'刘鹏飞'[0][0][0]'缺考'
2.将数据导出到*.xls文件
语法:
status=xlswrite(‘filename.xls’,‘数据’,‘工作表’,‘指定区域’)
成功返回1,失败返回0.
例11将矩阵或元胞数组的数据写成xls文件
代码:
xlswrite('testdata.xls',[12.75.02-9863.90-.256])
d={'Time','Temp';1298;1399;1497};
s=xlswrite('tempdata.xls',d,'Temperatures','E1')
运行结果:
textdata.xls
tempdata.xls(Temperatures)
最后看一个综合的实例。
例12读取数据、处理日期数据,根据日期绘制开盘价变化趋势图形。
ExpData.xlsx文件如下:
代码:
[num,txt]=xlsread('ExpData.xlsx');
%读取excel表格中的数据,数值存入num,文本存入txt
date=txt(2:
end,1)%取出日期数据单独处理
t=datenum(date)%将日期转化为数值(方便绘图使用)
date1=datestr(t)%将数值转化为日期
h=figure;%生成空的图形窗口
set(h,'color','w');%将图的背景颜色设为白色
plot(t,num(:
1));%以日期为横坐标,开盘价为纵坐标,绘制图形
%plot(t,num(:
1),'*');%绘制散点图
datetick('x',23);%将x轴标注变成日期格式:
mm/dd/yyyy
xlabel('日期');%标注x轴
ylabel('开盘价');%标注y轴
title=('上海证交所');%标注图片名称(很奇怪!
居然标题显示不出来)
运行结果:
txt=
'时间''开盘价''最高价''最低价''收盘价''成交量''成交金'
'2014/11/25'''''''''''''
'2014/11/26'''''''''''''
'2014/11/27'''''''''''''
'2014/11/28'''''''''''''
'2014/12/1'''''''''''''
'2014/12/2'''''''''''''
'2014/12/3'''''''''''''
'2014/12/4'''''''''''''
'2014/12/5'''''''''''''
'2014/12/8'''''''''''''
'2014/12/9'''''''''''''
'2014/12/10'''''''''''''
'2014/12/11'''''''''''''
'2014/12/12'''''''''''''
'2014/12/15'''''''''''''
date=
'2014/11/25'
'2014/11/26'
'2014/11/27'
'2014/11/28'
'2014/12/1'
'2014/12/2'
'2014/12/3'
'2014/12/4'
'2014/12/5'
'2014/12/8'
'2014/12/9'
'2014/12/10'
'2014/12/11'
'2014/12/12'
'2014/12/15'
t=
735928
735929
735930
735931
735934
735935
735936
735937
735938
735941
735942
735943
735944
735945
735948
date1=
25-Nov-2014
26-Nov-2014
27-Nov-2014
28-Nov-2014
01-Dec-2014
02-Dec-2014
03-Dec-2014
04-Dec-2014
05-Dec-2014
08-Dec-2014
09-Dec-2014
10-Dec-2014
11-Dec-2014
12-Dec-2014
15-Dec-2014
附录:
Matlab中的文件读写
1.文本文件的打开:
语法:
fid=fopen(‘文件名’,‘打开方式’)
fid为文件句柄【术语‘句柄’:
用来操作所打开文件的标识】,若fid返回值>0,表示打开文件成功;若返回值是-1,表示打开文件失败(一般是路径、文件名、后缀名出错引起的)。
注意:
用完文件要关闭:
fclose(fid);
打开方式有如下几种:
'r'
只读,文件必须存在(缺省的打开方式)
'w'
写文件,若文件已存在则原内容将被覆盖;若文件不存在则新建一个
'a'
在文件末尾添加,文件若不存在则新建一个
'r+'
可读可写,文件必须存在
'w+'
可读可写,若文件已存在则原内容将被覆盖;若文件不存在则新建一个
'a+'
可读可写可添加,文件若不存在则新建一个
文件有两种格式:
二进制文件(b)和文本文件(t),在Windows下,打开文件的默认是二进制格式,如果要以文本方式打开,则必须在打方式中加上字符't':
fid=fopen('output.txt','wt+');
2.文本文件的读取
语法:
[A,count]=fscanf(fid,format,size);
A——用来存放读取的数据
count——(可选)返回读取数据的个数
fid——为文件句柄
format用来控制读取的数据格式,由%加上格式符组成,下表中是常见的格式符,在%之后可以加上数据宽度,如%12d
c
字符型
g
浮点数(自动)
d
十进制整数
o
八进制
e
浮点数(科学计数法)
s
字符串
f
浮点数(小数形式)
x
十六进制
size——(可选)默认为读取整个文件,取值可以是:
N
读取N个数据到一个列向量
Inf
读取整个文件
[m,n]
读取mn个数据到一个mn矩阵中,按列存放
3.文本文件的写入
语法:
count=fprintf(fid,format,输出变量列表)
◆将输出变量按指定的格式写入文件中
◆若省略fid,则表示在屏幕上输出
◆count(可选)返回所写入的数据元素个数
◆format以%开头,通常由以下几个部分组成:
●fprintf命令的格式说明符
c
字符型
g
浮点数(自动)
d
十进制整数
o
八进制
e
浮点数(科学计数法)
s
字符串
f
浮点数(小数形式)
x/X
十六进制
●format中还可以使用的特殊字符
\b
退后一格
\t
水平制表符
\f
换页
\\
反斜杠
\n
换行
''
单引号
\r
回车
%%
百分号
读写的定位(判断和控制文件的读写位置:
是否读完,或读写指定位置数据等)
❑Matlab提供了四种文件位置指针定位函数:
fseek:
定位到文件的某个位置,若定位成功,status返回值为0,否则返回-1
status=fseek(fid,offset,origin)
offset表示位置指针相对偏移的字节数,‘+’表示向末尾走,‘-’表示向开头走;
origin表示参照位置:
'cof'表示当前位置,'bof'表示开始位置,'eof'表示末尾;
ftell:
返回值为从文件开始到指针当前位置的字节数:
position=ftell(fid)
frewind:
将位置指针返回到文件的起始位置:
frewind(fid)
feof:
判断文件位置指针是否达到文件结束位置,若是则返回1,否则返回0:
eofstat=ftell(fid)