我正在尝试将一种结构化文本文件读入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 作为值返回。这样我仍然无法将数字放入矩阵的第二部分。关于这些问题的任何想法?
答案 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.