我正在尝试读取包含数万行的.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倍。
我猜这与读取双精度时的错误有关,因为如果我尝试将文件读作字符串,就不会出现此问题。
但是如果可能的话,我不想把所有内容都读成字符串,并且必须将所有东西都转换为双打。
有什么想法吗?
答案 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