Matlab textscan 引入带有零或 NaN 的附加行

Matlab textscan introducing additional rows with zeros or NaNs

我正在尝试读取一个包含数万行的 .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 倍。

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

但如果可能的话,我不想将所有内容都读取为字符串,而必须将所有内容都转换为双精度值。

有什么想法吗?

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

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