原文地址: MATLAB小技:从文本数据第N行开始读取或者只读取特定几列 作者: ousman
在MATLAB中可以用 textread 命令来控制从第N行开始读取数据。比如输出的原始数据,第1行是空白数据,第2行是数据名称,第3行是空白行,而有用数据是从第4行开始,如下所示:
---------------------------------------------------------------------------------------------------------------
getData("P2:id getData("P2:gm getData("P2:gd getData("P2:vt
0.00000e+00 -2.02811e-14 2.35844e-13 1.23904e-14 -8.09185e-01
----------------------------------------------------------------------------------------------------------------

可用下面语句读取这些数据:
d=textread('nmos_vgs.dat', '' , 'headerlines', 2) %意味着读取数据的时候跳过前2行。
d=textread('nmos_vgs.dat', '' , 'headerlines', 3) %意味着读取数据的时候跳过前3行。
(这说明 textread 命令似能自动跳过数据段落的空白行?)

顺手转一段网上的关于 textread 命令的详细解释。
---------------------------------------------------------------------------------------------------------------
实际应用中经常要读取txt文件,这个时候就需要用到强大的textread函数。
它的基本语法是:
[A,B,C,...] = textread(filename,format)
[A,B,C,...] = textread(filename,format,N)
其中
filename就是文件名, format就是要读取的格式,A,B,C就是从文件中读取到的数据。中括号里面变量的个数必须和format中定义的个数相同。如果每N行相同格式的数据,可采用 [A,B,C,...] = textread(filename,format,N)的语法,读取N次。
举例如下:
例子1:myfile.txt 中的内容如下:
1 2 3 4
5 6 7 8
9 10 11 12
相应的语句为:
filename = '.myfile.txt';
[data1,data2,data3,data4]=textread(filename,'%n%n%n%n');
或者为
filename = '.myfile.txt';
[data1,data2,data3,data4]=textread(filename,'%n%n%n%n',3);


例子2:myfile.txt 中的内容如下:
1, 2, 3, 4
5, 6, 7, 8
9, 10, 11, 12
相应的语句为:
filename = '.myfile.txt';
[data1,data2,data3,data4]=textread(filename,'%n%n%n%n',
'
delimiter ' , ' , ' );
这里
delimiter指出分隔符,读数据的时候会自动跳过分隔符。
例子3:myfile.txt 中的内容如下:
% this a comment
1, 2, 3, 4
5, 6, 7, 8
9, 10, 11, 12
相应的语句为:
filename = '.myfile.txt';
[data1,data2,data3,data4]=textread(filename,'%n%n%n%n',
'
delimiter ' , ' , ' , ' headerlines ' , 1 );
这里告诉textread跳过一开始的1行,1可以替换为任意你要跳过的行数。
例子4:
myfile.txt 中的内容如下:

Sally Level1 12.34 45 Yes

相应语句为:

filename = '.myfile.txt';

[names, types, x, y, answer] = textread( filename , '%s %s %f %d %s', 1)
4.1如果要忽略12.34这个浮点数。
[names, types, y, answer] = textread( filename , '%s %s %*f %d %s', 1)
告诉textread跳过一个浮点数。
4.2 如果要忽略Level,指读取后面的数字,

[names, levelnum, x, y, answer] = textread( filename , ... '%s Level%d %f %d %s', 1)
例子5: myfile.txt 中的内容如下
1,2,3,4,,6
7,8,9,,11,12
想用nan替代为空的部分。
语句如下:
data = textread(' myfile.txt ', 'delimiter', ',', 'emptyvalue', NaN);
例子6: myfile.txt 中的内容如下
Sally Type1 12.34 45 Yes
Joe Type2 23.54 60 No
Bill Type1 34.90 12 No
如果只想读第一列,其余的跳过
filename = '.myfile.txt';
[names]=textread(filename,'%s%*[^n]')
%[^...] - reads characters not matching characters between the brackets until first matching character
%[^n] 就是一直读到行尾。
%*[^n] 就是从当前直接跳到行尾。
[names,rest]=textread(filename,'%s%[^n]')
例子7: myfile.txt 中的内容如下
Location;date;discharge
Lobith;1989-01-01;00:00;2801
Lobith;1989-01-02;00:00;2619
语法如下:
[Location,... % 1
yyyy ,... % 2a datestring year
mm ,... % 2b datestring month
dd ,... % 2c datestring day
HH ,... % 3a timestring hour
MM ,... % 3b timestring minute
discharge] = ...
textread(filename,'%s%f-%f-%f%f:%f%f',...
'headerlines',1,...
'delimiter' ,';');
textread不用先fopen那个文件,适用于格式统一的txt文件的一次性大批量读取。textread读取某个文件后,下次再用textread读取这个文件时
转载:http://www.eetop.cn/blog/html/03/6503-23236.html
例如文件my_data.txt包含了如下文件内容,有一行文本头,且格式化的数值数据。
num1 num2 num3 num4
0.3242 0.4324 0.3455 0.6754
0.4566 0.9368 0.9892 0.9274
0.4658 0.2832 0.9373 0.8233
因为有文件头,要使用如下textread命令来读取文件中的数据。
>> [num1 num2 num3 num4]=textread('my_data.txt','%f %f %f %f','headerlines',1)
执行结果如下:
num1 =
0.3242
0.4566
0.4658
0.8233
6. 读取字母数值混合的数据
若数据文件中包含了字母和数值混合的ASCII码数据,也可以使用函数textread来读取数据。由上一小节知道,函数textread可以返回多个输出变量,实际上用户还可以通过参数指定每个变量的数据类型。
例如要把文件my_exam.dat的全部内容读入工作空间,需要在textread行数的输入参数中指定数据文件的名称和格式。
文件my_exam.dat包含的混合的字母和数值如下:
Joe gradeA 4.9 pass
susan gradeD 2.0 fail
如果想把4列数据全部读取出放在4个变量中,则使用如下命令:
>> [name gra grades answer]=textread('my_exam.dat','%s %s %f %s')
在这里要注意命令中格式字符串的定义,对于格式字符串中定义的每种变换,必须指定一个单独的输出变量,textread 函数按格式字符串中指定的格式处理文件中的某个数据项,并把值放在输出变量中。输出变量的数目必须和格式字符串中指定的变换数目项匹配,在该例中,函数按格式字符串来读取文件my_exam.dat的每一行,直到文件读完,该命令的执行结果是:
name =
'Joe'
'susan'
'fail
另外,textread函数可以有选择地读取数据,比如我们不需要取出中间几列数据,只取出第一列和最后一列数据,则可以使用命令:
>> [name answer]=textread('my_exam.dat','%s %*s %*f %s')
name =
'Joe'
'susan'
answer=
'pass'
'fail'
若文件采用的分隔符不是空格,则必须使用函数textread ,将该分隔符作为它的参数。例如,若文件my_exam.dat 使用分号作为分隔符,则读入该文件需使用如下命令:
[name gra grades ans]=textread('my_exam.dat','%s %s %f %s', 'delimiter', '; ')
2.2.2 存写ASCII码数据
本小节介绍如何使用MATLAB函数按几种通用的ASCII码格式来存写数据,即如何使用这些函数来把一个MATLAB数值矩阵写入到一个文本文件中,其中该矩阵的列和行使用空格符来分隔。用户采用什么函数取决于所要存写数据的数据量和数据格式。
常用的两种ASCII码数据格式如下:
● 采用空格符分隔;
● 采用分号分隔。
MATLAB的存写数据函数如表2-3所示。
表2-3 数据存写函数
函 数 名 称
适 用 数 据

csvwrite
diary
数值数据或单元阵列
dlmwrite
fprintf
字母和数值数据
制表符或空格符
1. 存写有分隔符的ASCII码数据文件
若要将当前的MATLAB工作空间的一个或多个变量写到一个有分隔符的ASCII码文件中,可以使用save命令或dlmwrite函数。在默认情况下,save命令是以 MAT 格式存写数据的,这部分内容我们在后面详细介绍,本小节主要介绍 save命令通过ASCII码限定符以文本方式存写数据。而dlmwrite函数则可以提供更大的灵活性,它允许用户把任何字符指定为分隔符,也可以通过指定一个值域存写一个阵列的子阵列。
>> clear all;
>> x=rand(2,3);
>> save my_test1.dat x -ascii;
该命令将变量x中的数据存写到my_test1.dat文件中。通过文本编辑器,我们可以查看该文件的内容:
9.2181297e-001 1.7626614e-001 9.3546970e-001
7.3820725e-001 4.0570621e-001 9.1690444e-001
我们也可以将命令中的文件名和变量名省略,那样的话,命令的执行结果则是把当前 MATLAB工作空间中的所有变量保存到matlab.mat文件中。需要指明的是这时的文件虽然后缀名为.mat,但文件内容仍然是以文本方式保存的。
在默认情况下,save命令使用空格作为分隔符,但用户可以通过指定-tabs限定符来使用制表符而不是空格符作为分隔符。当使用save命令把一个字符阵列写入ASCII文件时,将ASCII码写入文件也就等于把字符写入文件。
若要以ASCII码形式存写一个阵列,并指定文件使用的分隔符,需要使用dlmwrite函数,比如重新指定分号作为分隔符,把变量x存到文件 my_test2.dat 文件中,查看其结果:
0.92181;0.17627;0.93547
0.73821;0.40571;0.9169
在默认情况下,dlmwrite函数用逗号或空格作为分隔符,或者是指定空的引号,即无分隔符。
2. 使用diary命令来存写数据
较小的数值阵列或单元阵列的存写可以使用diary命令,例如,在工作空间中有一个阵列A: A=[1 2 3 4 5; 6 7 8 9 10]
在命令提示符下执行如下命令:diary my_test3.dat,就可以创建my_test3.dat文件。接下来显示要存写的阵列A:
1 2 3 4 5
6 7 8 9 10
然后执行关闭diary命令:diary off。
这时,在文本编辑器中打开my_test3.dat文件,会发现diary命令创建的文件记录了在MATLAB会话期间的所有命令。可以通过编辑,删去无关的文本。
2.3 二进制数据
2.3.1 二进制数据的读取
本小节将介绍怎样将一般格式下的二进制数据文件读取到工作空间中。读取二进制数据常用的方法有两种,一是使用导入模板来导入,二是使用二进制数据导入函数来读取。
1. 使用导入模板读取二进制数据
要使用导入模板来读取二进制数据,需按以下步骤进行:
(1) 选择File→Import Data选项,弹出一个文件选择对话框;也可以使用uiimport函数来打开导入数据模板。
(2) 在文件选择对话框中选择想导入数据的二进制数据文件,然后单击Open按钮,导入数据模板就会打开该文件并准备处理其内容。
(3) 选择要导入的变量。在默认情况下,导入模板将要建立的变量取决于文件中的数据类型。
(4) 单击Finish按钮完成数据的导入。
这个过程和使用导入模板读取文本文件是基本一致的,这里就不再举例了。
2. 使用导入函数读取二进制数据
若要从命令行或一个 M 文件中读取二进制数据,就必须使用 MATLAB 导入函数,函数的选择取决于文件中数据的格式,这些函数如表2-4所示。
表2-4 导入二进制数据函数
函 数 名 称
读取文件的扩展名
数 据 格 式
读取MATLAB下的MAT数据格式的数据
aviread
读取AVI格式的音频视频数据
cdfread
读取CDF格式的数据
读取HDF格式的数据
imread
.bmp .cur .gif .hdf .ico
.jpg .pbm .pgm .png .pnm
.ppm .pcx .tif .xwd .ras
读取各种格式的图形数据
wavread
读取 Windows 系统的声音文件
xlsread
读取 Excel 电子表格数据
2.3.2 二进制数据的存写
要以一种标准二进制格式来存写二进制数据,可以使用 MATLAB 提供的高端函数,函数的选择取决于要存写数据的类型,这些函数如表2-5所示。
表2-5 导出二进制数据函数
函 数 名 称
读取文件的扩展名
数 据 格 式
存写MATLAB下的MAT数据格式的数据
avifile
存写AVI格式的音频视频数据
cdfwrite
存写CDF格式的数据
存写HDF格式的数据
imwrite
.bmp .cur .gif .hdf .ico
.jpg .pbm .pgm .png .pnm
.ppm .pcx .tif .xwd .ras
存写各种格式的图形数据
wavwrite
存写 Windows 系统的声音文件
xlswrite
存写 Excel 电子表格数据
在MATLAB中可以将一系列的图像保存为电影,这样使用电影播放函数就可以进行回放,保存方法可以同保存其他MATLAB工作空间变量一样,通过采用MAT文件格式保存。但是若要浏览该电影,必须在MATLAB环境下。在以某种格式存写一系列的MATLAB图像时,不需要在MATLBA 环境下进行预览,通常采用的格式为AVI格式。AVI是一种文件格式,在PC 机上的Windows系统或UNIX操作系统下可以进行动画或视频的播放。
若要以AVI格式来存写MATLAB图像,步骤如下:
(1) 用avifile函数建立一个AVI文件。
(2) 用addframe函数来捕捉图像并保存到AVI 文件中。
(3) 使用close函数关闭AVI文件。
若要将一个已经存在的MATLAB电影文件转换为AVI文件,需使用函数movie2avi。函数原型为:
movie2avi(mov,filename)
movie2avi(mov,filename,param,value,param,value...)
2.4 使用文件I/O函数
前面介绍的都是MATLAB中的一些高级函数,除此之外MATLAB还包含了一组低端的文件I/O函数,如前面介绍的所有文件的打开和关闭函数:fopen函数和fclose函数。这些函数是建立在ANSI标准C库中的I/O函数。若用户对C语言熟悉的话,那么也肯定熟悉这些函数。比如,MATLAB 文件I/O函数使用和C语言同样的编程模式等。要读写这些数据,需进行以下几步:
(1) 使用fopen函数打开文件。fopen函数将会返回一个文件标志,通过它,就可以使用其他所有的低端文件I/O函数。
(2) 对文件进行操作,如:读写二进制数据、格式化读写文本数据等。
(3) 使用fclose函数来关闭文件。
2.4.1 二进制数据的读取
使用fread函数可从文件中读取二进制数据,它将每个字节看成整数,并将结果以矩阵形式返回。对于读取二进制文件,fread必须制定正确的数据精度。
fread的基本调用方法是:
A=fread(fid)
其中fid是一个整数型变量,是通过调用fopen函数获得的,表示要读取的文件标识符,输出变量A为矩阵,用于保存从文件中读取的数据。
例如文件test.txt的内容如下:
test it
用fread函数读取该文件,输入如下命令:
>> f=fopen('test.txt','r');
>> answer=fread(f)
answer =
输出变量的内容是文件数据的ASCII码值,若要验证读入的数据是否正确,通过下面的命令可以验证。
>> disp(char(ans1'))
test it
fread函数的第二个输入参数可以控制返回矩阵的大小,例如:
>> f=fopen('test.txt','r');
>> answer=fread(f,2)
answer =
也可以把返回矩阵定义为指定的矩阵格式,例如
>> f=fopen('test.txt','r');
>> an=fread(f,[2 3])
answer =
116 115 32
101 116 105
使用fread函数的第三个输入变量,可以控制fread将二进制数据转成MATLAB 矩阵用的精度,包括一次读取的位数(Number of Bits)和这些位数所代表的数据类型。
常用的精确度类型有下列几种,如表2-6所示。
表2-6 常见的精确度类型
数 据 类 型

带符号的字符(通常是8h16)
uchar
无符号的字符(通常是8bits)
short
短整数(通常是16bits)
长整数(通常是16bits)
float
单精度浮点数(通常是32bits)
double
双精度浮点数(通常是64bis)
2.4.2 二进制数据的写入
使用fwrite函数可将矩阵按所指定的二进制格式写入文件,并返回成功写入文件的大小。函数的调用方式如下:
count=fwrite(fid,A,precision)
其中,count用来返回写入文件数据的大小,f参数同样是通过fopen函数获得的整数型变量,表示文件标识符,A表示要写入的数据矩阵,第三个参数precision同二进制读取函数的参数一样,表示数据的写入格式。
在下例中fwrite产生一个大小为100字节的二进制文件,它包含了一个5×5阶魔方矩阵,共25个元素,每个元素占用4个字节。
f=fopen('magic5.bin', 'w');
fwrite(f,magic(5), 'int32');
fclose(f)
二进制文件在不同的计算机架构上可能存储方式不同,所以二进制文件存在兼容性问题,而文本文件则不存在这种兼容性问题。不同的存储方式导致在不同架构上保存的二进制文件在另外的平台上无法读取,这主要是因为多字节数据类型在计算机硬件上的存储顺序不同。在MATLAB中,无论计算机上的数据存储顺序是哪一种,都可以读写二进制文件,但要正确地调用fopen函数打开文件。
2.4.3 格式化读取ASCII码数据
fscanf函数与C语言中的fscanf在结构、含义和使用上都很相似,即能够从一个有格式的文件中读入数据,并将它赋给一个或多个变量。两个函数都采用同一组格式指定符来控制输入数据的格式,fscanf的格式指定符由字符%开头,常用格式如表2-7所示。
表2-7 常见的用于输入的格式转换符
格式转换符

读取字符型变量,也可以指定多个字符,'<'
读取字符串变量
读取整数型变量
读取浮点数
读取双精度浮点数
例如,我们仍然读取my_test.dat文件中的数据,其数据内容是:
4.5646767e-001 8.2140716e-001 6.1543235e-001
1.8503643e-002 4.4470336e-001 7.9193704e-001
通过下面这段代码,将该文件中的数据读取到列向量T中。
>> f=fopen('my_test.dat','r');
>> T=fscanf(f,'%g');
>> fclose(f)
也可以通过以下代码段把文件数据读取到一个3×2矩阵A中。
>> f=fopen('my_test.dat','r');
>> A=fscanf(f,'%g',[3 2]);
>> fclose(f)
执行后结果如下,这时候A矩阵恰好是文件中数据矩阵的转置。
0.4565 0.0185
0.8214 0.4447
0.6154 0.7919
2.4.4 格式化写入文本数据
fprintf将会把数据转换为字符串,并将它们输出到屏幕或文件中。一个格式控制字符串包含转换指定符和可选的文本字符,通过它们来指定输出格式。转换指定符用于控制阵列元素的输出。
当fprint函数做标准输出,也就是运行结果显示在屏幕上的时候,它的功能和disp函数相类似,区别仅在于fprint可以输出特定格式的文本数据。
比如,创建一个2×2的魔方矩阵,然后打开一文件,写入数据。
>> clear all;
>> x=magic(2);
>> fid=fopen('exam4.txt','w');
>> fprintf(fid,'%4.2f %8.4fn',x);
>> fclose(fid);
执行这段程序段之后,我们可以检验一下执行结果:
1 3
4 2
>> type exam4.txt
1.00 4.0000
3.00 2.0000
可以看出,fprintf函数在打印显示矩阵数据时,数据转换规则是可以按列方式循环作用于矩阵的各个元素的,这个例子中显示出来的结果就好像原矩阵的转置,而且分别按数据转换规则显示。
2.4.5 控制文件位置指针
每一次打开文件时,MATLAB就会保持一个文件位置指针(File Position Indicator),由它决定下一次进行数据读取或写入的位置。控制此指针的函数如表2-8所示。
表2-8 控制位置指针的函数
函 数 名 称
功 能 说 明
fseek
设定指针位置
ftell
获得指针位置
frewind
重设指针到文件起始位置
测试指针是否在文件结束位置
fseek 函数用于指定文件指针的位置,调用方式如下:
status=fseek(fid,offset,origin)
fid是指定的文件标识符。offset为整数型变量,表示相对于指定位置需要的偏移字节数,正数表示向文件末尾偏移,负数表示向文件开头偏移。Origin可以是特定字符串,也可以是整数,表示文件中的参考位置。参考位置的参数说明如表2-9所示。
表2-9 参考位置参数的说明
参考位置(origin)

'bof '或者 -1
'cof '或者 0
文件中当前位置
'eof '或者 1
ftell 函数用来获得当前文件指针的位置,调用方式如下:
position=ftell(fid)
fid是指定的文件标识符。Position为返回值,表示当前指针的位置。position是以相对于文件开头的字节数来表示的。如果返回值为–1,表示未能成功调用。这是可以通过调用feeeor(fid)的具体的错误信息。
frewind 函数用来把文件指针重新复位到文件开头。调用方式如下:
frewind(fid)
其中fid为指定的文件标识符,其作用和fseek(fid,0,-1)是等效的。
feof 函数用来判断是否到达文件末尾。调用方式如下:
eofstat=feof(fid)
其中fid为指定的文件标识符。eofstat是返回值,当到达文件末尾时,eofstat为1;否则为0。比如我们仍然对文件my_test.dat执行以下命令,然后测试文件指针位置
>> f=fopen('my_test.dat','r');
>> A=fscanf(f,'%g',[3 2])
0.4565 0.0185
0.8214 0.4447
0.6154 0.7919
>>feof(f)
在本例中,文件指针指向最后一个数据,而不是文件末尾,因此返回值是0,而不是1,但是若执行以下命令:
>> f=fopen('my_test.dat','r');
>> A=fscanf(f,'%g',[4 2])
0.4565 0.4447
0.8214 0.7919
0.6154 0
0.0185 0
>>feof(f)
在my_data.dat文件中只包含6个数字,因此feof函数返回值为1。若要重新设置指针到起始位置,就可以直接使用frewind函数。
2.5 MAT 文 件
MAT文件是MATLAB使用的一种特有的二进制数据文件。MAT文件可以包含一个或者多个MATLAB 变量。MATLAB通常采用MAT文件把工作空间的变量存储在磁盘里,在MAT文件中不仅保存各变量数据本身,而且同时保存变量名以及数据类型等。所以在MATLAB中载入某个MAT文件后,可以在当前MATLAB工作空间完全再现当初保存该MAT 文件时的那些变量。这是其他文件格式所不能的。同样,用户也可以使用MAT文件从MATLAB环境中导出数据。MAT文件提供了一种更简便的机制在不同操作平台之间移动MATLAB数据。
2.5.1 在MATLAB中读写MAT文件
在MATLAB环境中,通常使用load和save两个命令进行 MAT 文件的读和写。在默认情况下,这两个命令以 MAT 文件格式处理文件,但是也可以用-ascii参数选项来强制用文件方式处理文件。关于这点已经在本章介绍过了,这里主要介绍如何读写MAT文件。
1. load 函数的使用
load函数可以从MAT文件中读取数据,例如要读取mymat.dat文件,可以直接执行命令load mymat.dat,因为给出要读取的文件的后缀名是MAT,因此命令则以MAT文件格式读取数据,否则将以文本文件读取数据。命令中的文件名可以包含单引号,也可以不包含,也就是说该函数也可以这样调用:load 'mymat.mat' 。
load 函数还可以指定只读取文件中的某几个变量,只需在文件名之后列出想要读取的变量的变量名就可以了,变量名也可以使用通配符。
比如命令load mymat.mat y*,执行结果就是将文件中所有以y开头的变量读取出来。
load还有一种函数形式的调用方式。这种调用方式就要求文件名必须是字符串,比如要导入mymat.mat文件,那么函数形式的调用必须是s = load('mymat.mat')。
2. save函数的使用
save 函数的功能是把当前MATLAB工作空间的一个或多个变量存写到外部文件。在默认情况下,save 函数以MAT格式存写数据。若在命令中直接调用该函数,不带任何参数,执行结果是把MATLAB工作空间的所有变量保存到系统默认的matlab.mat文件中。当然,带上文件名参数,就可以将当前工作空间中的所有变量存写在指定的 MAT文件中。