我在从文本文件中读取一些固定宽度(6E12)数据时遇到问题。 请注意文件中有前导空格。
第一行并不重要。 但是,从第2行开始,我想读取59个值。
PleaseAnswer 3 , ThisQuestion 40
0.00000E+00 4.78181E+01-4.76356E+01 3.76280E-01 0.00000E+00 1.59238E+00
1.88171E+00 1.73928E-06 0.00000E+00 3.57826E+01 0.00000E+00 0.00000E+00
0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
0.00000E+00 3.75261E-07 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
0.00000E+00 0.00000E+00 0.00000E+00 3.28103E+01 0.00000E+00 0.00000E+00
0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
...
正如您将在下面看到的,由于负号,我遇到第2和第3个值的问题。我不明白为什么没有领先的空间。几乎我所有的数字都应该有一个领先的空间,除了负数。
fid = fopen(filename);
dontcare = textscan(fid, '%s %d %s %s %n', 1);
fixme = textscan(fid, '%12s', 59, 'Delimiter', '', 'Whitespace', '');
fixme{1}
ans =
' 0.00000E+00'
'4.78181E+01-'
'4.76356E+01 '
'3.76280E-01 '
'0.00000E+00 '
'1.59238E+00'
' 1.88171E+00'
'1.73928E-06 '
'0.00000E+00 '
'3.57826E+01 '
'0.00000E+00 '
'0.00000E+00'
' 0.00000E+00'
'0.00000E+00 '
'0.00000E+00 '
'0.00000E+00 '
'0.00000E+00 '
'0.00000E+00'
' 0.00000E+00'
...
答案 0 :(得分:0)
您可以使用正则表达式进行标记。此解决方案使用dyamic数组,因此如果您在大文件中读取,则需要先预先分配行计数。不是最优雅,但它有效。
fid = fopen('file.txt','r');
line = fgetl(fid); % ignore first line
l=1;
done = false;
while ~done
line = fgetl(fid);
if line ~= -1 %empty line is returned
[s,e] = regexp(line, '-?[0-9]+\.[0-9]+E[+-][0-9]+','start','end'); %not sure why tokens aren't working
for i=1:numel(s)
data(l,i) = str2double(line(s(i):e(i))); %grab the ith match between start and end
end
l=l+1;
else
done = true;
end
end
data
<强>输出:强>
>> test
data =
0 47.8181 -47.6356 0.3763 0 1.5924
1.8817 0.0000 0 35.7826 0 0
0 0 0 0 0 0
0 0.0000 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 32.8103 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0