数据的读取

更新时间:2023-09-14 14:58:01 阅读量: 初中教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1. 纯数据(列数相同): 源文件:

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

解答:对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。 2.字段名(中、英文字段均可)+数据: 源文件:

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文件 源文件:

Group 2 12.02.2006Limei Samples of datas: 50000 CH0 CH1 CH2 CH3

0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698

目标文件: 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); )。一个简单的、非通用的包含注释的读取方法如下: clc;clear;

fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline)

if double(tline(1))>=48 && double(tline(1))<=57 %数值开始 a=strread(tline);

a(3:4)=[];

fprintf(fid_n,'%f %f\\n',a); clear a;

elseif double(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); clear b b1 b2 b3 b4; else

fprintf(fid_n,'%s\\n',tline); end else

fprintf(fid_n,'%s\\n',tline); end end

fclose(fid); fclose(fid_n);

4. 注释(不含独立的数字串)+数据(列数相同): 源文件: 你好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. 注释与数据混排:

对此当然只能自己编程,举例: 源文件: 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) % 判断是否为文件末尾

tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 [m,n]=size(tline); flag=1;

for i=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

if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\\n',tline); end end end

fclose(fidin); fclose(fidtmp);

data=textread(tmpfile); delete(tmpfile);

另外,如果要求不高,也可以使用textread函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释) 6.各列数据的分离: 源文件:

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

解答:直接用 [a,b,c,d,e,f]=textread(yourfilename,'%d %c %f %f %s %c'); 便可 四. 注意事项:

1. 请在matlab中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。

2. 存取时,请给出该数据文件的全称(包括后缀名,读取mat文件时可省略)

3. load data.txt和A=load(‘data.txt’)的区别请参阅精华贴:[原创]写给学习matlab的新手们

4. 请根据读写需要来打开文件,即根据你的需要来指定fopen的 permission 属性为读或写。如果只用 a 进行写入,就不能用fread读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个错误的例子: CODE:

filename='e.dat';

fid=fopen(filename,'a'); if fid<0

error('fopen error'); end

s=[1 2 3 4;5 6 7 8]; fwrite(fid,s,'float32')

[ddll]=fread(fid,inf,'float32');%把t中的数据全部读出,即s矩阵。 fclose(fid);

此时得到的dd, ll是错误且无意义的! 五. 其他相关问题:

1. 连续读取多个文件的数据,并存放在一个矩阵中: (1) 首先是如何读取文件名: 方法一:

filename=dir(‘*.jpg’);

那么第i个文件的文件名就可以表示为 filename(i).name

文件数量为:length(filename) 方法二:

先在Windows的 MSDOS(命令行)中使用以下命令生成一个list.txt文件: dir path\\folder /on /b /s > path\\list.txt 举例:dir d:\\test /on /b /s > d:\\list.txt 然后在matlab中使用:

filename = textread(sFileFullName,'%s');

把所有文件名读取到list细胞矩阵中,最后对filename{i}便可得到各文件名。 (2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是m*n的,则: CODE:

k = length(filename); Data = zeros(m,n,k); for ii = 1:k

Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle是对应的文件读取方式的函数 end

2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中:

假设每个文件对应的数据是m*n的,则以上述第二种文件名读取方法为例: CODE:

k = length(filename); for ii = 1:k

D = yourreadstyle(filename{ii}); eval(*‘Data_’, num2str(ii), ‘ = D;’+); end

3. 文件名命名问题:

文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879. 准备把这些文件名给放到一个数组里面去。 解答: CODE:

a=cell(879,1); for k=1:879

a{k} = sprintf('%.5d',k); end

4. 上述各种文件格式、类型自动识别问题:可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例1到例5各种情形,不过由于存在自动判断,对某些例子(如例1)效率自然要低一点,而对于另外的例子(如例3、例5)效率估计要高一点(少用了一个循环)。 CODE:

function [data]=distilldata_eight(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) % 判断是否空行

str = '[^0-9 | \\. | \\- | \\s | e | E]'; %正则表达式为:该行中是否包含除 - . E e数字和空白字符外的其他字符

start = regexp(tline,str, 'once'); ifisempty(start)

fprintf(fidtmp,'%s\\n',tline); end end end

fclose(fidin); fclose(fidtmp);

data=textread(tmpfile); delete(tmpfile)

5. 大量数据的读取问题:

可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: [原创]提高matlab运行速度和节省空间的一点心得(之三))。另外,也可参考《深入浅出MATLAB 7_X混合编程》一书第一章 6. 读取整个txt文件的内容(获得文件中的所有字符): CODE:

f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略 x = fread(f,'*char'); fclose(f);

7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = [1 2 3;4 5 6] ,希望得到的 txt 文件如下: QUOTE: a1: 123 a2: 1 2 3 4 5 6

如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦: CODE: a1=123;

a2=[1 2 3;4 5 6];

fid = fopen('myfile.txt', 'wt'); fori=1:2

fprintf(fid, '%s: \\n %s\\n', ['a',int2str(i)], mat2str(eval(['a',int2str(i)]))); end

fclose(fid);

相反,如果写入的时候复杂一点,则读取的时候会简单一点: CODE: a1=123;

a2=[1 2 3;4 5 6];

fid = fopen('myfile.txt', 'wt'); fori=1:2

fprintf(fid, '%s: \\n', ['a',int2str(i)]); b = eval(['a',int2str(i)]);

fprintf(fid, [repmat('%d ', 1, size(b,2)), '\\n'], b'); end

fclose(fid);

本文来源:https://www.bwwdw.com/article/5afh.html

Top