Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于MATLAB的跳行条件_Matlab_File_Scanf - Fatal编程技术网

基于MATLAB的跳行条件

基于MATLAB的跳行条件,matlab,file,scanf,Matlab,File,Scanf,在MATLAB中读取文本文件时,我使用: file = fopen(filename, 'r'); formatSpec = '%d %d %d %d'; A = fscanf(file, formatSpec, [4 Inf]); 并非每一行都符合formatSpec,并且可能包含错误消息。现在,Matlab将只在与上述格式不对应的行处停止 如何跳过formatSpec无法匹配的所有行 输入文件如下所示: 04 2 1 312 04 2 2 212 04 error 05 2 1 421

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

file = fopen(filename, 'r');
formatSpec = '%d %d %d %d';
A = fscanf(file, formatSpec, [4 Inf]);
并非每一行都符合formatSpec,并且可能包含错误消息。现在,Matlab将只在与上述格式不对应的行处停止

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

输入文件如下所示:

04 2 1 312
04 2 2 212
04 error
05 2 1 421
应该给我以下矩阵:

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

这应该适用于您的示例。 它读取一行,按空格分隔,并检查所有元素是否都是整数(可以更改为double或else)。如果有字符串,则跳过该行,否则会将元素写入矩阵,并用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)=[];
全部清除
fclose all;
文件名='text_test.dat';
file=fopen(文件名为'r');
linemax=1000;
元素最大值=100;
A=零(linemax,elementsmax);
直线=1;
实元素max=1;
而(feof(file)==0&&line
这应该适用于您的示例。 它读取一行,按空格分隔,并检查所有元素是否都是整数(可以更改为double或else)。如果有字符串,则跳过该行,否则会将元素写入矩阵,并用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)=[];
全部清除
fclose all;
文件名='text_test.dat';
file=fopen(文件名为'r');
linemax=1000;
元素最大值=100;
A=零(linemax,elementsmax);
直线=1;
实元素max=1;
而(feof(file)==0&&line< />代码>查看命令,而不是<代码> fSCANF,并尝试使用函数的<代码>“空值”/代码>和“代码>”处理空函数“< /代码>”参数。虽然不是对问题的答案,但请考虑使用<代码> GRP< <代码>或<代码> AWK < /代码>预处理您的输入文件。这在过去对我来说效果很好-如果您的数据文件很大,那么在MATBLAB中处理输入文本可能会对性能产生重大影响(这可能对您的应用程序很重要,也可能不重要),因此,首先确保所有数据都是干净的就更简单了。感谢您的回答,我将研究textscan。因为我不太擅长使用grep/awk,所以我希望在Matlab中实现这一点。请查看命令而不是
fscanf
,并尝试使用函数的
'EmptyValue'
'TreatAsEmpty'
参数。虽然这不是对您问题的真正答案,考虑使用<代码> GRP或 AWK对输入文件进行预处理。这在过去对我来说效果很好-如果您的数据文件很大,那么在MATBLAB中处理输入文本可能会对性能产生重大影响(这可能对您的应用程序很重要,也可能不重要),因此,首先确保所有数据都是干净的就更简单了。感谢您的回答,我将研究textscan。因为我不太擅长使用grep/awk,所以我希望在Matlab中这样做。我使用带有[4 Inf]格式化参数的fscanf的原因是我无法知道文件的大小advance@LukasHäfliger,这应该不是我发布的代码的问题,因为我保持了它的通用性。您可以将elementsmax设置为10000,因为最终所有多余的线都将被消除,因此您拥有正确的形状。该限制仅为预分配所需的内存。我之所以将fscanf与[4 Inf]格式化参数一起使用,是因为我无法知道预分配中文件的大小advance@LukasHäfliger,这应该不是我发布的代码的问题,因为我保持了它的通用性。您可以将elementsmax设置为10000,因为最终所有多余的线都将被消除,因此您拥有正确的形状。限制仅为预分配所需的内存。