Matlab阅读文本问题

时间:2014-12-03 14:32:26

标签: matlab io

我正在尝试将一种结构化文本文件读入MatLab。它读起来像这样:

 Header

 Result  Damage  "Load Analysis"      0.002000000    Vector    OnNodes
ComponentNames "DN", "DT"
Values
    1  0.00000000E+00  0.00000000E+00
    2  0.00000000E+00  0.00000000E+00
    3  0.00000000E+00  0.00000000E+00
    4  0.00000000E+00  0.00000000E+00
End Values

 Result  Damage  "Load Analysis"      0.004000000    Vector    OnNodes
ComponentNames "DN", "DT"
Values
    1  0.00000000E+00  0.00000000E+00
    2  0.00000000E+00  0.00000000E+00
    3  0.00000000E+00  0.00000000E+00
    4  0.00000000E+00  0.00000000E+00
End Values

值继续以块为单位重复。对于文件中的每个块,我只需要从重复块内的行中读取这3个值。我想到了这样的代码:

fid=fopen('FileName.res');
while ~feof(fid)
    tline = fgetl(fid);
    if ischar(strtrim(tline)) == 1
        continue
    else
    %command to put the values within a matrix of kind A[inf,3]
    end
end

第一个问题是,当涉及实际数字的行时,命令 ischar 1 作为值返回。这样我仍然无法将数字放入矩阵的第二部分。关于这些问题的任何想法?

2 个答案:

答案 0 :(得分:1)

如果您的文件具有一致的格式,我会查看textscan,因为它非常灵活,适用于像您这样的块的文件。

否则,对于尽可能接近原始代码的解决方案,只需尝试将每行读取为数字,如果成功,则将数字添加到表中,如果失败,则转到下一行。< / p>

fid=fopen('FileName.res');
fullTable = [] ;
while ~feof(fid)
    tline = fgetl(fid);
    tempRow = sscanf( tline , '%d%f%f' ).' ; %' // try to read the string as numbers
    if ~isempty(tempRow)
        fullTable = [ fullTable ; tempRow ] ; % // append numbers to the master table
    end
end
fclose(fid)

答案 1 :(得分:0)

问题是fgetl只是将整行读作字符串。即ischar('1 2 3')返回true。它可能包含数字,但变量类型本身是一个字符串。因此,您需要查看fgetl返回的类型,而不是内容。

未经测试,但我认为这样可行:

fid=fopen('FileName.res');
while ~feof(fid)
    tline = fgetl(fid);
    if strcmp(tline,'Values')
       tline = fgetl(fid); % this should read the line starting 1
       while strncmp(tline,'End',3) %only match first three letters
         % put values in matrix
         tline = fgetl(fid); % get next line
       end
    end
end

这应该做什么:

1)读取行,直到找到一个读取&#39;值&#39; (如果还读入了空格,则可能需要使用strcmp / strncmp。)
2)阅读下一行
3)将值放在矩阵中 4)阅读下一行
5)如果下一行没有开始&#39;结束&#39;,请返回3.
6)如果下一行确实开始&#39;结束&#39;,请返回1.