Matlab文本可以引入带有零或NaN的其他行

时间:2015-08-07 18:03:23

标签: matlab string-formatting nan textscan

我正在尝试读取包含数万行的.dat文件,其中每行都看起来像:

   1.9681968    0   0   19.996  0   61  100 1.94E-07    6.62E-07  
   2.330233     0   0   19.996  0   61  100 1.94E-07    6.62E-07
   2.6512651    0   0   19.997  0   61  100 1.94E-07    6.62E-07
   3.5923592    0   0   19.998  0   61  100 1.96E-07    6.62E-07

现在,例如,我正试图用

来阅读它
    Data = textscan(fid, %.9f%*f%*f%.9f%*f%*f%*f%.9f)

其中字符串格式取决于我想要读取的列。

读取大文件时,单元格数组'Data'的第一列将变为

    1.96819680000000
    0
    2.33023300000000
    2.65126510000000
    0
    3.59235920000000
    0

,其余列将显示NaN而不是零。 额外的行几乎与数据文件中的行一样多,因此我得到的数组几乎要大2倍。

我猜这与读取双精度时的错误有关,因为如果我尝试将文件读作字符串就不会出现此问题。

但是如果可能的话,我不想把所有内容都读成字符串,并且必须将所有东西都转换为双打。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为问题在于格式字符串。尝试下面显示的格式字符串。

fid = fopen('test.txt'); 
% data = textscan(fid, '%.9f%*f%*f%.9f%*f%*f%*f%.9f')
data = textscan(fid, '%f %f %f %f %f %f %f %f %f');
data = cell2mat(data)
fclose(fid);

其中test.txt是包含给定示例数据的文本文件。上面的代码给出了以下输出。

1.9682         0         0   19.9960         0   61.0000  100.0000    0.0000       NaN
2.3302         0         0   19.9960         0   61.0000  100.0000    0.0000    0.0000
2.6513         0         0   19.9970         0   61.0000  100.0000    0.0000    0.0000
3.5924         0         0   19.9980         0   61.0000  100.0000    0.0000    0.0000

当文本仅包含八个值时,请注意NaN值。如果要为行包含较少值时指定默认值,请使用EmptyValue设置:

data = textscan(fid, '%f %f %f %f %f %f %f %f %f','EmptyValue', 42);

然后你会得到:

1.9682         0         0   19.9960         0   61.0000  100.0000    0.0000   42.0000
2.3302         0         0   19.9960         0   61.0000  100.0000    0.0000    0.0000
2.6513         0         0   19.9970         0   61.0000  100.0000    0.0000    0.0000
3.5924         0         0   19.9980         0   61.0000  100.0000    0.0000    0.0000

然后,您可以通过索引生成的矩阵来获取第一列,如data(:,1)输出以下内容:

1.9682
2.3302
2.6513
3.5924