基于条件MATLAB跳过线

时间:2015-11-02 09:11:36

标签: matlab file scanf

在MATLAB中读取文本文件时,我使用:

- 2353535.123213.124 -> 2353535.123213.124
- data.2354234.1324.1314 -> 2354234.1324.1314
- data.old-24234.2341.4325 -> 24234.2341.4325
- aaaa.53535 -> Do nothing

并非每一行都符合formatSpec,并且可能包含错误消息。现在,Matlab将停在不符合上述格式的行上。

如何跳过formatSpec无法匹配的所有行?

所以输入文件如下所示:

file = fopen(filename, 'r');
formatSpec = '%d %d %d %d';
A = fscanf(file, formatSpec, [4 Inf]);

应该给我以下矩阵:

04 2 1 312
04 2 2 212
04 error
05 2 1 421

1 个答案:

答案 0 :(得分:0)

这适用于你的例子。 它读取一行,用空格分隔它并检查所有元素是否都是整数(这可以改为double或者其他)。如果有一个字符串,则跳过该行,否则它会将元素写入矩阵并用NaN填充其余部分。后者仅适用于每行有不同数量的元素的情况...... 只需确保linemax大于数据文件中的行数,并且elementsmax大于每行的元素数。

clear all
fclose all;
filename = 'text_test.dat';

file = fopen(filename, 'r');
linemax     = 1000;
elementsmax = 100;
A = zeros(linemax,elementsmax);
line = 1;
real_elementsmax = 1;
while (feof(file) == 0 && line < linemax)       % read until the end of the file is reached
    linetext = fgetl(file); %read frst line of the file
    text_array=regexp(linetext,' ','split');
    if min(isint(str2double(text_array)))
        nelements = size(text_array,2);
        A(line,1:nelements) = str2double(text_array(1:nelements));
        A(line,nelements+1:elementsmax) = NaN;
        line = line+1;
        real_elementsmax = max(real_elementsmax,nelements);
    end
end
fclose(file);
A(line:linemax,:)=[];
A(:,real_elementsmax+1:elementsmax)=[];