数据的读取
更新时间:2024-06-12 13:03: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);
可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: [原创]提高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);
正在阅读:
数据的读取06-12
2019-2020年高中物理必修二第二章《匀速圆周运动》word章末总结03-08
北京《明代宦官碑传集》10-25
新版石材幕墙施工合同范本06-02
移植uCOS-II到ARM708-18
励志音乐02-19
从社会互动到集体行动04-15
通州各中学情况01-11
北外1603-国际贸易实务 参考答案01-26
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 读取
- 数据
- 高铭暄刑法学第5版(总论)
- 高三地理-中山2015年2月试题 - 图文
- 在全县新任农村干部培训班上的讲话
- 小城镇综合提升规划文本01.25
- 屋租赁管理系统设计与实现
- 2017级工商管理学科学术型硕士研究生培养方案
- 建团90周年知识竞赛多选题
- 《蛮书》所记白蛮语的源流
- 直线与圆方程知识总结
- 岗位职责、权限 - 图文
- 统计学
- 特种设备整改报告格式及编制要求
- 五年级英语上册 Unit1 My new teachers第二课时教案 人教PEP
- 作物栽培学总论第一章 绪论
- 在全市国税系统党风廉政建设工作会议上的讲话
- 初中物理电学-变阻器、电路图专项练习
- 《中国共产党党组工作条例(试行)》解读(上)课后测试汇总
- 广东省义务教育规范化学校建设督导验收办法
- 各类型诗歌的主要内容及常抒发的情感(分类齐全、清晰)
- 个人与团队考试用