使用MATLAB忽略文本文件中间的标题行

使用MATLAB忽略文本文件中间的标题行,matlab,file-io,textscan,Matlab,File Io,Textscan,我有一个文本文件,包含多个观察部分。每次,当新的观察开始时,文件都有一些关于以下数据的信息(如文件头) 当我使用textscan时,我只能阅读第一部分。例如,数据排列如下: 1993-01-31 17:00:00.000 031 -61.00 1993-01-31 18:00:00.000 031 -55.00 1993-01-31 19:00:00.000 031 -65.00 Format

我有一个文本文件,包含多个观察部分。每次,当新的观察开始时,文件都有一些关于以下数据的信息(如文件头)

当我使用
textscan
时,我只能阅读第一部分。例如,数据排列如下:

1993-01-31 17:00:00.000 031       -61.00

1993-01-31 18:00:00.000 031       -55.00

1993-01-31 19:00:00.000 031       -65.00

 Format                                                   
 Source of Data                           
 Station Name               
 Data Interval Type     1-hour                                       
 Data Type              Final                                        

1993-02-01 00:00:00.000 032       -83.00

1993-02-01 01:00:00.000 032       -70.00

1993-02-01 02:00:00.000 032       -64.00

从上面开始,我只想从“1993”开始读取数据行,忽略中间的文本块。

< P>正如您注意到的,“代码>文本扫描当无法解析输入时停止阅读。事实上,你可以利用这个优势。例如,在您的例子中,您知道每个“好”数据集之间有5行垃圾。因此,我们可以运行
textscan
一次以获得第一个集合,然后连续运行它几次(将
Headerlines
设置为5以忽略这5行),以获得文件中的每个“良好”数据集。然后连接所有数据

这是因为当您将
textscan
与文件标识符一起使用时,它不会在文件标识符返回后将其倒回文件的开头。它将其保留在无法解析的位置。因此,对
textscan
的下一个调用从您离开的地方开始(减去您指定的任何标题行)


正如您所注意到的,
textscan
在无法解析输入时停止读取。事实上,你可以利用这个优势。例如,在您的例子中,您知道每个“好”数据集之间有5行垃圾。因此,我们可以运行
textscan
一次以获得第一个集合,然后连续运行它几次(将
Headerlines
设置为5以忽略这5行),以获得文件中的每个“良好”数据集。然后连接所有数据

这是因为当您将
textscan
与文件标识符一起使用时,它不会在文件标识符返回后将其倒回文件的开头。它将其保留在无法解析的位置。因此,对
textscan
的下一个调用从您离开的地方开始(减去您指定的任何标题行)


您必须逐行解析文件,或者对文件应用一些预处理以删除那些头行(可能使用
grep
sed
UNIX工具删除以[a-zA-Z]开头的行),您必须逐行解析文件,或者对文件应用一些预处理以删除那些头行(可以使用
grep
sed
UNIX工具删除以[a-zA-Z]开头的行)@Mushi它是您最初用来解析文件的格式说明符。我不知道您在您的案例中使用了什么,所以我只是将它设置为一个变量。如果您在问题中发布用于解析此内容的代码,我可以将其放在这里。这是
textscan
的第二个输入。很抱歉,我在提出问题后意识到了这一点。现在,问题是,我得到的数据不是串联的。我得到了与观察数相等的数据块。每个数据块都是以单元格的形式存在的。你知道如何修复它吗。@Mushi很容易修复。你能发布你的格式说明符,让我知道你需要什么吗?@Mushi我只是以一种不管什么都应该有效的方式更新了答案您的格式说明符非常完美。非常感谢。@Mushi它是您最初用来解析文件的格式说明符。我不知道您在您的案例中使用了什么,所以我只是将它作为一个变量。如果您在问题中发布您用来解析此问题的代码,我可以将其放在这里。这是
textscan
的第二个输入,很抱歉提出这个问题.我问了一个问题后意识到了这一点。现在,问题是,我得到的数据不是串联的。我得到了与观察数相等的数据块。每个数据块都是以单元格的形式存在的。你知道如何修复它吗。@Mushi很容易修复。你能发布你的格式说明符,让我知道你需要什么吗?@Mushi刚刚更新了answ在某种程度上,不管你的格式如何,它都应该是有效的。非常感谢。
fid = fopen(filename, 'r');

% Don't ignore any lines but read until we stop
data = textscan(fid, formatspec);

% Repeat until we hit the end of the file
while ~feof(fid)
    % Skip 5 lines and read until we can't read anymore
    newdata = textscan(fid, formatspec, 'HeaderLines', 5);

    % Append to existing data
    data = cellfun(@(x, y)cat(1, x, y), data, newdata, 'uni', 0);
end

fclose(fid)