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