High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。
举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以调用一些low level routines自己写一个函数,或者是简单的用TEXTREAD函数。
使用high level routines的关键是:文件必须是相似的(homogeneous),换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。
LOAD/SAVE
主要的high level file I/O routines 是LOAD
可以读MAT-file data或者用空格间隔的格式相似的ASCII data.
SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII
file
1 5 4 16 8
5 43 2 6 8
6 8 4 32 1
90 7 8 7 6
5 9 81 2 3
Example:
用 LOAD and SAVE 读写数据
CODE:
% Load the file to the matrix, M :
M =
load(‘sample_file.txt‘)
% Add 5 to M :
M = M
+5
% Save M to a .mat file called
‘sample_file_plus5.mat‘:
save sample_file_plus5 M
% Save M to an
ASCII .txt file called ‘sample_file_plus5.txt‘ :
save sample_file_plus5.txt
M -ascii
UIGETFILE/UIPUTFILE
UIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。UIGETFILE让你选择一个文件来写(类似Windows ‘另存为’选项?)。用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。
Example:
用 UIGETFILE 从当前目录选择一个 M-file
注意: UIGETFILE 一次只能选择一个文件。
UIIMPORT/IMPORTDATA
UIIMPORT是一个功能强大,易于使用的基于GUI的high level routine,用于读complex data files。文件也必须是homogeneous。
IMPORTDATA形成UIIMPORT的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件‘sample_file2.txt‘
This is a file header.
This is file is an example.
col1 col2 col3 col4
A
B
C
D
Example: Using IMPORTDATA to read in a file with headers, text,
and numeric data
可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入:
data = D.data
text = D.textdata
可以用UIIMPORT读同一个文件并得到同样的结构.
注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。
TEXTREAD/STRREAD
TEXTREAD
两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个
“两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level
routines的做法),并且你可以改变他们以匹配你特定的应用(如同low level routines做到的)。例子:
CODE:
Example 1: Using TEXTREAD to read in an entire file into a cell array
% This command reads in the file fft.m into the cell array,
file
file =
textread(‘fft.m‘,‘%s‘,‘delimiter‘,‘\n‘,‘whitespace‘,‘‘);
CODE:
Example 2: Using STRREAD to read the words in a
line
% This command uses the cell array created in Example 1
to
% read in each word of line 28 in ‘file‘ to a cell array,
words
words = strread(file{28},‘%s‘,‘delimiter‘,‘‘)
CODE:
Example 3: Using TEXTREAD to read in text and
numeric data from a file with headers
% This command skips the 2 header
lines at the top of the file
% and reads in each column to the 4 specified
outputs
[c1 c2 c3 c4] = textread(‘sample_file2.txt‘,‘%s %s %s
%s‘,‘headerlines‘,2)
CODE:
Example 4: Using TEXTREAD to read in specific rows of text and numeric
data from a file
% This command reads in rows B and C of the file. The
‘headerlines‘
% property is used to move down to the desired starting row
and the
% read operation is performed 2 times
[c1 c2 c3 c4] = textread(‘sample_file2.txt‘,...
‘%s %s %s
%s‘,2,‘headerlines‘,4)
CODE:
Example 5: Using TEXTREAD to read in only the numeric data from a file
containing text and numbers
% This command reads in only the numeric
data in the file. The
% ‘headerlines‘ property is used to move down to the
first row
% of interest and the first column of text is ignored
with the
% ‘*‘
[c2 c3 c4] = textread(‘sample_file2.txt‘,‘%*s %d %d
%f‘,‘headerlines‘,3)
DLMREAD/DLMWRITE/CSVREAD
DLMREAD
CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。以‘sample_file.txt‘为例:
注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。
WK1READ/WK1WRITE
WK1READ
XLSREAD
XLSREAD用来读Excel的数值和文本数据。
三.
具体例子分析:
Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了:
1. 纯数据(列数相同):
源文件:
CODE:
0 3866.162 2198.938 141.140
1 3741.139 2208.475 141.252
2
3866.200 2198.936 141.156
3 3678.048 2199.191 141.230
4 3685.453
2213.726 141.261
5 3728.769 2212.433 141.277
6 3738.785 2214.381
141.256
7 3728.759 2214.261 141.228
8 3748.886 2214.299 141.243
9
3748.935 2212.417 141.253
10 3733.612 2226.653 141.236
11 3733.583
2229.248 141.223
12 3729.229 2229.118 141.186
解答:对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。
2.字段名(中、英文字段均可)+数据:
源文件:
CODE:
CH0 CH1 CH2 CH3
0.000123 0.000325 0.000378 0.000598
0.000986
0.000256 0.000245 0.000698
解答:由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用
importdata 便可。
3.注释(含有独立的数字串)+数据(列数相同):
问题:这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件
源文件:
CODE:
Group
2
Samples of
datas: 50000
CH0
0.000123
0.000986
目标文件:
CODE:
Group 2 12.02.2006 Limei
Samples of datas: 50000
CH0 CH1
0.000123 0.000325
0.000986 0.000256
解答:由于注释中含有独立的数字串,且注释部分没有明显的格式, 这时候用importdata,
load等高级命令直接读取会失败,用 textread, dlmwrite
等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即:[a b c d] =
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)
end
fclose(fid);
fclose(fid_n);
---------------------------------------------------------------------------------
4. 注释(不含独立的数字串)+数据(列数相同):
源文件:
CODE:
你好 abc
欢迎来到 我们
振动论坛
vib.hit.edu.cn
1 11 111 1111
2
22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555
解答:直接用 importdata 便可
注:有时候注释中含有独立的数字串也可以 importdata
成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。
5. 注释与数据混排:
对此当然只能自己编程,举例:
源文件:
CODE:
1 11 111
1111
你好
2 22 222 2222
欢迎来到
3 33 333 3333
振动论坛
4 44 444
4444
vib.hit.edu.cn
5 55 555 5555
解答:
--------------------------------------------转--------------------------------------
CODE:
function [data]=distilldata(infile)
%功能说明:
%将保存数据的原始文件中的数值数据读入到一个data变量中
%使用说明:
% infile——原始数据文件名;
%
data=数据变量
tmpfile=‘tmp2.mat‘;
fidin=fopen(infile,‘r‘); %
打开原始数据文件(.list)
fidtmp=fopen(tmpfile,‘w‘); % 创建保存数据文件(不含说明文字)
while ~feof(fidin) % 判断是否为文件末尾
end
fclose(fidin);
fclose(fidtmp);
data=textread(tmpfile);
delete(tmpfile);
---------------------------------------------------------------------------------------------------------
另外,如果要求不高,也可以使用
textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释)
6.各列数据的分离:
源文件:
CODE: