如何在MATLAB中读取可能包含标题的文件?

如何在MATLAB中读取可能包含标题的文件?,matlab,file-io,formatted-input,Matlab,File Io,Formatted Input,最初,我的文件如下所示: 1.4 2.0 4.2 2.1 5.1 1.2 列号是固定的,而行号随文件而异。以下代码可以读取这些文件: fid = fopen("my_file.txt","r"); M = fscanf(fid,"%f",[2,inf]); 这里M是数据文件的转置 现在,我得到了几个可能只有一行标题的新文件,标题以#开头: 可以保证then标头占用的行数不超过一行,并且始终以开头 我知道我可以逐行读取文件来处理标题。我想知道是否有任何方法可以对我的原始代码进行尽可能少的更改,

最初,我的文件如下所示:

1.4 2.0
4.2 2.1
5.1 1.2
列号是固定的,而行号随文件而异。以下代码可以读取这些文件:

fid = fopen("my_file.txt","r");
M = fscanf(fid,"%f",[2,inf]);
这里
M
是数据文件的转置

现在,我得到了几个可能只有一行标题的新文件,标题以
#
开头:

可以保证then标头占用的行数不超过一行,并且始终以
开头

我知道我可以逐行读取文件来处理标题。我想知道是否有任何方法可以对我的原始代码进行尽可能少的更改,以便新代码可以读取两种格式的文件


textscanf
函数似乎能够处理标题,但字段
Headerlines
的参数是一个固定数字。

如果已知标题以特定字符作为前缀,则可以使用的NV对忽略它们:

使用以下
test.txt

# A header line
1 2
3 4
5 6
我们可以使用:

fID = fopen("test.txt", "r");
M = textscan(fID, "%f", "CommentStyle", "#");
M = reshape(M{:}, 2, []).';
fclose(fID)
这给了我们:

>> M

M =

     1     2
     3     4
     5     6

或者,如果您想继续使用,可以使用检查文件的第一行,并在必要时使用(因为
fgetl
移动文件指针),在没有头的情况下返回到文件的开头

例如:

fID = fopen("test.txt", "r");

% Test for header
tline = fgetl(fID);  % Moves file pointer to next line
commentchar = "#";
if strcmp(tline(1), commentchar)
    % Header present, read from line 2
    M = fscanf(fID, "%f", [2, inf]).';
else
    % Header present, rewind to beginning of file & read as before
    frewind(fID);
    M = fscanf(fID, "%f", [2, inf]).';
end
fclose(fID);
这给出了与上面相同的结果。如果标题行的数量不是恒定的,您可以开始使用
while
循环跳过过去的标题,但在这一点上,您可能会使事情变得比此应用程序实际需要的更复杂

fID = fopen("test.txt", "r");

% Test for header
tline = fgetl(fID);  % Moves file pointer to next line
commentchar = "#";
if strcmp(tline(1), commentchar)
    % Header present, read from line 2
    M = fscanf(fID, "%f", [2, inf]).';
else
    % Header present, rewind to beginning of file & read as before
    frewind(fID);
    M = fscanf(fID, "%f", [2, inf]).';
end
fclose(fID);