声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5136|回复: 19

[编程技巧] 文件读取数据的问题

[复制链接]
发表于 2007-4-18 01:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
刚开始用Matlab处理数据,碰到这样的问题:有一个dat文件,是由以string的形式存储的数字组成的.这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件,我编了以下的程序,但出错了.
程序如下:
fidein=fopen('c:\Matlab_Auswertung_3D_1D\3.dat', 'rt')
inputtext=fscanf(fidein,'%s %s', [2  inf])
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 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-4-18 10:16 | 显示全部楼层
原帖由 wrx 于 2007-4-18 01:11 发表
刚开始用Matlab处理数据,碰到这样的问题:有一个dat文件,是由以string的形式存储的数字组成的.这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的 ...



文件太大?或者你的电脑内存太少?

应该不需要fgetl
 楼主| 发表于 2007-4-18 13:18 | 显示全部楼层
谢谢楼上的回答,我的文件是不小,数据有699990行.
但我现在还是不太明白,我想同时提取文字说明和前2行,用fscanf提取矩阵[2  inf]就可以了吗?能同时把文字说明提出来吗?能帮我看看具体程序有什么毛病吗?
非常感谢,我现在还是一头雾水.请高手指导
发表于 2007-4-18 14:47 | 显示全部楼层
原帖由 wrx 于 2007-4-18 13:18 发表
谢谢楼上的回答,我的文件是不小,数据有699990行.
但我现在还是不太明白,我想同时提取文字说明和前2行,用fscanf提取矩阵就可以了吗?能同时把文字说明提出来吗?能帮我看看具体程序有什么毛病吗?
非常感谢,我现在 ...


应该可以吧,其实你自己做个小测试就可以了:先把数据文件行数减少(即删除大部分数据,留下前面的文字说明和几个有用的数据),然后用你的程序做做
 楼主| 发表于 2007-4-19 04:31 | 显示全部楼层
谢谢指导,我已经减少了数据文件行试过了,现在是不报错了,也能在新的文件中写入数据了.
但是结果不对.我的文件内容大概是这个形式:
Group 2  12.02.2006   Limei
Samples of datas: 50000

CH0  CH1  CH2  CH3
0.000123  0.000325   0.000378   0.000598
0.000986  0.000256   0.000245   0.000698

我在减少了数据行,在原来的程序的基础上用了如下的命令:
inputtext=fscanf(fidein,'%c  %c', [2  20]),也就是把%s换成了%c, 把inf换成了20
得到的结果是:

G  r
o  u
p  2
1  2
0  2
2  0
0  6
L  i
m  e
i  s
依次类推

而我想要的结果是.
Group 2  12.02.2006   Limei
Samples of datas: 50000

CH0          CH1            
0.000123  0.000325   
0.000986  0.000256   


我是不是还是无法用fscanf实现上述的结果,我应该怎么样才能实现上述的结果呢,请高手帮忙!
 楼主| 发表于 2007-4-19 16:20 | 显示全部楼层
呵呵,在线等,谢谢了:handshake
发表于 2007-4-19 16:31 | 显示全部楼层
原帖由 wrx 于 2007-4-19 16:20 发表
呵呵,在线等,谢谢了:handshake



本版关于文件读取的帖子有n多,你自己看看,然后参考一下,特别是精华贴
发表于 2007-4-19 16:56 | 显示全部楼层

回复 #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
           [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);
有一点麻烦,没时间捉摸更好的,请大虾指教。
就当是一个参考吧
exp.txt取得内容是
Group 2  12.02.2006   Limei
Samples of datas: 50000

CH0  CH1  CH2  CH3
0.000123  0.000325   0.000378   0.000598
0.000986  0.000256   0.000245   0.000698

评分

1

查看全部评分

 楼主| 发表于 2007-4-20 13:41 | 显示全部楼层
感谢楼上,我已经试过你的程序了,但是出现了问题,得到的结果是ans=3,而且也无法生成新的文件,即ex.dat,不知道是什么原因,还望继续指教.:handshake  谢谢
发表于 2007-4-20 15:11 | 显示全部楼层
你用的是什么版本啊,我用的是matlab2006b,我试过了没有问题啊
是不是你的文件还有其他格式

[ 本帖最后由 feifeifool 于 2007-4-20 15:17 编辑 ]
 楼主| 发表于 2007-4-20 15:44 | 显示全部楼层
我用的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=[b1{1},'  ',b2{1}]; 表示的什么意思呢?

不好意思,这么多问题,谢谢了
发表于 2007-4-20 16:33 | 显示全部楼层
iif double(tline(1))>=48 && double(tline(1))<=57 是表示首字母有数值么?   
            是表示有数值                   
elseif double(tline(1))==67 表示什么意思呢?  
         表示首字母有C
a(3:4)=[]; 表示把3,4列都去了么?
            
b=[b1{1},'  ',b2{1}]; 表示的什么意思呢?
          把元胞数组的字符值取出来,中间夹一个空格

评分

1

查看全部评分

 楼主| 发表于 2007-4-20 19:27 | 显示全部楼层
谢谢你的解答,现在我基本明白了,但是我用MATLAB2006B也试了,得到的结果是ans=2,而且也无法生成新的文件,即ex.dat,请能指点一下是什么原因么?谢谢了
发表于 2007-4-22 08:54 | 显示全部楼层

回复 #13 wrx 的帖子

是不是文件的形式还包含其他的东西啊
 楼主| 发表于 2007-4-22 15:18 | 显示全部楼层
不好意思,我以前写的是文件的一个大体形式,因为之前我在家里,没有具体的数据,所以只是写了了一个文件的大体形式,这会影响程序的执行吗?还有执行以后并没有报错,只是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万行.

还请高手继续指导,万分感谢!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-14 21:37 , Processed in 0.071439 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表