文件读取数据的问题
刚开始用Matlab处理数据,碰到这样的问题:有一个dat文件,是由以string的形式存储的数字组成的.这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件,我编了以下的程序,但出错了.程序如下:
fidein=fopen('c:\Matlab_Auswertung_3D_1D\3.dat', 'rt')
inputtext=fscanf(fidein,'%s %s', )
inputext=inputtext'
disp(inputtext)
fclose(fidein)
fidaus=fopen('c:\Matlab_Auswertung_3D_1D\6.dat', 'wt')
fprintf(fidaus, ''%s %s\n', inputtext)
fclose(fidaus)
运行的结果报出以下的错误:
Error using:fscanf
out of memory Type Help Memory
for your options
我不明白问题出在哪里,因为我想把文字和前2列都提出来,是不是还要用到命令fgetl, 应该怎么用啊?需要循环吗?
不好意思,刚开始用Matlab好多不明白,问了这么多,请高手帮忙解答一下,万分感谢
[ 本帖最后由 eight 于 2007-4-19 16:30 编辑 ] 原帖由 wrx 于 2007-4-18 01:11 发表
刚开始用Matlab处理数据,碰到这样的问题:有一个dat文件,是由以string的形式存储的数字组成的.这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的 ...
文件太大?或者你的电脑内存太少?
应该不需要fgetl 谢谢楼上的回答,我的文件是不小,数据有699990行.
但我现在还是不太明白,我想同时提取文字说明和前2行,用fscanf提取矩阵就可以了吗?能同时把文字说明提出来吗?能帮我看看具体程序有什么毛病吗?
非常感谢,我现在还是一头雾水.请高手指导 原帖由 wrx 于 2007-4-18 13:18 发表
谢谢楼上的回答,我的文件是不小,数据有699990行.
但我现在还是不太明白,我想同时提取文字说明和前2行,用fscanf提取矩阵就可以了吗?能同时把文字说明提出来吗?能帮我看看具体程序有什么毛病吗?
非常感谢,我现在 ...
应该可以吧,其实你自己做个小测试就可以了:先把数据文件行数减少(即删除大部分数据,留下前面的文字说明和几个有用的数据),然后用你的程序做做 谢谢指导,我已经减少了数据文件行试过了,现在是不报错了,也能在新的文件中写入数据了.
但是结果不对.我的文件内容大概是这个形式:
Group 212.02.2006 Limei
Samples of datas: 50000
CH0CH1CH2CH3
0.0001230.000325 0.000378 0.000598
0.0009860.000256 0.000245 0.000698
我在减少了数据行,在原来的程序的基础上用了如下的命令:
inputtext=fscanf(fidein,'%c%c', ),也就是把%s换成了%c, 把inf换成了20
得到的结果是:
Gr
ou
p2
12
02
20
06
Li
me
is
依次类推
而我想要的结果是.
Group 212.02.2006 Limei
Samples of datas: 50000
CH0 CH1
0.0001230.000325
0.0009860.000256
我是不是还是无法用fscanf实现上述的结果,我应该怎么样才能实现上述的结果呢,请高手帮忙! 呵呵,在线等,谢谢了:handshake 原帖由 wrx 于 2007-4-19 16:20 发表
呵呵,在线等,谢谢了:handshake
本版关于文件读取的帖子有n多,你自己看看,然后参考一下,特别是精华贴
回复 #5 wrx 的帖子
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
=strread(tline,'%s %s %s %s');
b=;
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);
有一点麻烦,没时间捉摸更好的,请大虾指教。
就当是一个参考吧
exp.txt取得内容是
Group 212.02.2006 Limei
Samples of datas: 50000
CH0CH1CH2CH3
0.0001230.000325 0.000378 0.000598
0.0009860.000256 0.000245 0.000698 感谢楼上,我已经试过你的程序了,但是出现了问题,得到的结果是ans=3,而且也无法生成新的文件,即ex.dat,不知道是什么原因,还望继续指教.:handshake谢谢 你用的是什么版本啊,我用的是matlab2006b,我试过了没有问题啊
是不是你的文件还有其他格式
[ 本帖最后由 feifeifool 于 2007-4-20 15:17 编辑 ] 我用的MATLAB 7.0,我的原文件是dat,生成的文件也是dat.还有一些地方不大明白, iif double(tline(1))>=48 && double(tline(1))<=57 是表示首字母有数值么? elseif double(tline(1))==67 表示什么意思呢?
a(3:4)=[]; 表示把3,4列都去了么?
b=; 表示的什么意思呢?
不好意思,这么多问题,谢谢了 iif double(tline(1))>=48 && double(tline(1))<=57 是表示首字母有数值么?
是表示有数值
elseif double(tline(1))==67 表示什么意思呢?
表示首字母有C
a(3:4)=[]; 表示把3,4列都去了么?
是
b=; 表示的什么意思呢?
把元胞数组的字符值取出来,中间夹一个空格 谢谢你的解答,现在我基本明白了,但是我用MATLAB2006B也试了,得到的结果是ans=2,而且也无法生成新的文件,即ex.dat,请能指点一下是什么原因么?谢谢了
回复 #13 wrx 的帖子
是不是文件的形式还包含其他的东西啊 不好意思,我以前写的是文件的一个大体形式,因为之前我在家里,没有具体的数据,所以只是写了了一个文件的大体形式,这会影响程序的执行吗?还有执行以后并没有报错,只是ans=2,是不是表示程序本身没有问题呀?下面是原文件的具体形式,这是一个dat文件:
Datenlogger V1.0 (08.11.2006) by limei
Samplerate: 20000.000000
Points: 3000000
Date of record: 02.12.2006
CH0 CH1 CH2 CH3
0.03272 0.05012 -0.05201 -0.08967
0.03076 0.05693 -0.05316 -0.08041
依次类推,数据行大概有5万行.
还请高手继续指导,万分感谢!
页:
[1]
2