numeca 发表于 2004-2-4 10:38:28

matlab读取文件的问题,谢谢

有一文本格式的文件(不是排列规则的数据文件)
我想读入matlab,找到某行的m到n列的一个数据,并读出来
请问怎样才能做到,谢谢

numeca 发表于 2004-2-4 10:42:02

回复: matlab读取文件的问题,谢谢

不好意思,搜索了一下,好像有2个相关的帖子,我先学习一下
不懂再请教
不好意思

numeca 发表于 2004-2-8 20:24:09

回复: matlab读取文件的问题,谢谢

一个问题,谢谢

我需要用matlab写一个文本文件,这个文件内容形如:

PROJECT_TYPESTRUCTURED
GRID_FILE   D:\Program\AIRFOIL\MeshData\Airfoil_001.igg
TRB_FILE      \usr\unknown
GEOMETRY_FILE \usr\unknown
LAST_USED_COMPUTATION_INDEX    0
  NI_BEGIN computation
    VERSION                        4.0
    NAME      
。。
。。。(几百行)

每次写一个文件时,只有红色部分需要按顺序改变
比如变成002、003
请大家指点一下该怎么做合适

btw:我的问题比较弱,但一般的教科书里还没有,因此到论坛求助,请不吝赐教,真心感谢!

taohe 发表于 2004-2-8 21:48:24

回复: matlab读取文件的问题,谢谢

这种情况,我一般会用num2str来产生那些红色字体的部分。

比如我们专门写一个函数来做这件事情:

function inpfile(fileName, theNumber)
% INPFILE 产生一个什么什么文件
%
% 输入:
%   fileName ---- 字符串变量,代表文件名(可以包含完整路径)
%   theNumber ---- 数字量,上面红色字体里变化的那几个数字
%
% 输出:
%   无。
%
% %%%%%%%%%%%%%%%%%%%%%%5%%%%%%

% 先打开文件,最好判断打开成功与否。

% 用字符串变量代表每一行内容,逐行写文件,遇到有红色字体的那一行,用num2str把那个数字变成字符串,然后重新组成那一行,再写入文件。
。。。


ps. 最近两天我上simwe特别慢,大家觉得和平时一样吗,可能是我这里网络的问题。

numeca 发表于 2004-2-9 09:30:41

回复: matlab读取文件的问题,谢谢

谢谢taohe!
再请教:
因为这个文件有好几百行
用字符串变量代表每一行内容,逐行写文件
这样的话,会产生很多的字符串变量,会不会使这个函数文件太庞大?

我想这样,您看能否做到,该怎样做

首先我创建一个样本文件,然后我打开这个文件
将红色字体之前的所有很多行字符赋予一个字符变量(a)
将红色字体之后的所有很多行字符赋予另一个字符变量(b)

然后我打开目标文件
依次写入字符变量的内容
a
红色部分字符
b

您看该怎么做到,谢谢!

另:最近几天,确是我上论坛也有点慢

taohe 发表于 2004-2-9 19:00:09

回复: matlab读取文件的问题,谢谢

我的原意是只用一个字符串变量,


% 把第一行的内容付给一个变量,比如tmpText
% 把tmpText写入文件

% 把第二行的内容再付给tmpText
% 把tmpText写入文件

...
% 如此直到最后


你说的是用样本文件也是一个好办法。把要生成的文件里共同的部分写成一个样本文件,然后在真正写文件的时候再打开样本文件,逐行读入。

bigrice 发表于 2004-2-9 20:56:57

回复: matlab读取文件的问题,谢谢

这几天网站出了点儿问题,希望能够尽快好转。
谢谢各位支持!

numeca 发表于 2004-2-10 17:52:15

回复: matlab读取文件的问题,谢谢

写文件的问题搞定了,谢谢taohe兄
在样本文件已经存在的基础上,用fileread函数解决了上述问题

又遇到从文件读数据的问题
包含数据的文本文件形如

BEGIN
......
  ITER GRID RMS_RES. MAX_RES.       I   J   K   X         
    0    1   0.0000   3.5769   1   1 162   12.7359E+01   
    1    3-0.6807   2.0136   1   141   17.4468E+03   
    2    3-1.0019   1.7710   1   141   11.2444E+04   
......
   99    3-1.1080   1.4862   1   143   19.2215E+03   
......
  ITER GRID RMS_RES. MAX_RES.      I   J   K   X         
1000    1-6.4640-2.8453   1   122   12.3573E+04
1001    1-6.4741-2.8974   1   122   12.3573E+04
......
......
1013    1-6.4821-2.8732   1   1 296   12.3573E+04
1014    1-6.4806-2.8848    1   1 296   12.3573E+04
END


我想得到最后一行数据中MAX_RES.对应的数据
请问该怎样实现,给我提个思路,谢谢

taohe 发表于 2004-2-11 20:41:34

回复: matlab读取文件的问题,谢谢

如果文件不大,比如只有1000多行的话,可以考虑把整个文件都读进取,每列分别给一个变量,这样就可以很容易地取出某一列在第几行的数值。

如果数据量比较大,则不要读入全部的数据,而是在每次需要取数据的时候打开文件,逐行读入,但并不保留,从上往下,直到找到想要的数据,返回该变量。

大家看看还有什么好的思路。

SCIE 发表于 2004-2-11 21:02:21

回复: matlab读取文件的问题,谢谢

如果能计算出所需要的数据的位置的话就好办了。

pandya 发表于 2004-2-12 22:27:47

回复: matlab读取文件的问题,谢谢

Matlab有一个函数可以自动产生a001,a002,a003,.....这样的文件名,我忘了

numeca 发表于 2004-2-13 09:55:59

回复: matlab读取文件的问题,谢谢

谢谢几位的热心回复
今天得到一个简单的方法(是其他朋友给出的,非我原创)
不敢独享,请大家看看

A=textread(file,'%s');
str2num(A{end-6})

ans=
-2.8848

我试了,确实可以,只是不明白{}和()有何区别,end又是什么变量

btw:说一下我自己的笨方法,要读两次文件

% 确定此文件有多少行(numline1)
fid = fopen(file,'r');
numline = 0;
while feof(fid) ~= 1
    line = fgetl(fid);
    numline = numline + 1;
end
fclose(fid);
% 寻找文件确定的某行(newnumline)的字符形式的数据
newnumline = numline - 1;
fid = fopen(file,'r');
numline = 0;
while feof(fid) ~= 1
    line = fgetl(fid);
    numline = numline + 1;
    if numline == newnumline   
        break
    end
end
fclose(fid);

然后再从line中寻找需要的数据
也能成功,但显然效率太低了,见笑了

taohe 发表于 2004-2-14 14:48:03

回复: matlab读取文件的问题,谢谢

第一种方法是把整个文件都读入到一个大的字符串中,然后处理,很显然,如果文本文件很大的时候,系统负担会很重。

在textread中用%s选项,则A是一个cell array,取其中的每一个元素就要用{}而不是(),end表示给元素的最后一个元素,在这个例子离他就是字符串‘END’,那么再往回数,你要的那个正好是倒数第七个元素,也就是end-6

你自己的那个方法效率低了一些。有人在傲雪回了你的帖子,我顺便贴在这里,这个方法是从文件的后面网前数起,所以要找倒数第二行的东西的话,效率应该还不错,:I

clear all

% 假设文件存为testax01.txt
fid = fopen ('testax01.txt', 'rt');
fseek(fid, -1, 1);
lastLineNo = 0;
offset = -1;
tmpLine2 = fgetl(fid);
while 1
    offset = offset - 1;
    fseek(fid, offset, 1);
    tmpLine1 = tmpLine2;
    tmpLine2 = fgetl(fid);
    if ( isequal(tmpLine1, tmpLine2))
        lastLineNo = lastLineNo + 1;
    end
    
    %如果是倒数第二行,则退出
    if lastLineNo == 2
        break
    end
end

%重新读入倒数第二行的内容
tmpLine1 = fgetl(fid);
fclose(fid);

%把倒数第二行的内容转为数字量
tmpVal = str2num(tmpLine1);

%MAX_RES所对应的是该行第四列的元素
fprintf('MAX_RES (in the last second line) = %f\n', tmpVal(4));

numeca 发表于 2004-2-14 16:34:32

回复: matlab读取文件的问题,谢谢

谢谢!
我开始用matlab主要是些简单的数值计算
但现在的工作需要借助matlab的平台将我自己的计算程序和其他软件的数据有机结合起来,这样才能做到无须人工干预
遇到最多的问题,就是有关字符操作和文件操作
通过这个问题,我对这些算是有了个基本的了解,再次谢谢各位!

市面上网络上的书讲的一般都是matlab的数值计算,关于文件等的操作讲的很少:(

btw:现在我的程序已经在自动运行了,还好读取文件所需的时间远远少于软件计算数据的时间,基本够用了。等结果出来后再想办法进一步提高效率

cwit 发表于 2004-2-14 20:07:42

回复: matlab读取文件的问题,谢谢

这个问题是很常见的,我也来凑凑热闹。
如果要在matlab里面显示txt文件的信息,可以用textread将此txt文件的内容全部读出来了,读出的数据是一个cell型的字符串数据,然后用一个listbox显示出来。简单使用。

taohe 发表于 2004-2-14 22:13:30

回复: matlab读取文件的问题,谢谢

但问题是如果文本文件很大的时候,如果用readtext全部读入整个文件的话,可能不太经济。

cwit 发表于 2004-2-16 11:53:32

回复: matlab读取文件的问题,谢谢

你说的很对,大文件就感觉就是死机。命令只有一行,连进度条都没有办法加。所以具体运用场合要自己选择最合适的方法。
比如超大的txt文件,如果只是查看并不编辑,建议还是用SCIE的mexrun调用写字板打开。

gyy2005 发表于 2004-11-18 12:17:10

pilaochou11 发表于 2005-7-5 06:09:38

yhma618 发表于 2005-7-10 15:08:26

页: [1] 2
查看完整版本: matlab读取文件的问题,谢谢