无法在matlab中读取固定宽度(6E12)数字。

无法在matlab中读取固定宽度(6E12)数字。,matlab,text,io,Matlab,Text,Io,从文本文件中读取某些固定宽度(6E12)数据时遇到问题。 请注意,文件中有前导空格 第一行没那么重要。 但是,从第二行开始,我想读取59个值 file.txt 结束文件.txt 正如您将在下面看到的,由于负号,我遇到了第二个和第三个值的问题。我不明白为什么没有引导空间。几乎我所有的数字都应该有一个前导空格,除了负数 我正在读这个文件 结束我尝试读取文件您可以使用正则表达式标记化。此解决方案使用动态数组,因此,如果您在一个大文件中读取,您将希望获得预先分配的行数。虽然不是最优雅的,但它很管用 fi

从文本文件中读取某些固定宽度(6E12)数据时遇到问题。 请注意,文件中有前导空格

第一行没那么重要。 但是,从第二行开始,我想读取59个值

file.txt 结束文件.txt 正如您将在下面看到的,由于负号,我遇到了第二个和第三个值的问题。我不明白为什么没有引导空间。几乎我所有的数字都应该有一个前导空格,除了负数

我正在读这个文件
结束我尝试读取文件您可以使用正则表达式标记化。此解决方案使用动态数组,因此,如果您在一个大文件中读取,您将希望获得预先分配的行数。虽然不是最优雅的,但它很管用

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

我一定错过了什么。为什么它捕获行开头的空格,而不是值之间的空格?另外,请注意,行上的最后一个值甚至不是12个字符,而是11个!我以为我让matlab给我12。我可以通过使用“%12f”而不是“%12s”或“%12c”来“工作”。但是,我仍然不知道在读取文件时如何正确捕获空格。
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