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

时间:2016-03-21 18:50:18

标签: 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                                                   
 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'开头的数据行。

1 个答案:

答案 0 :(得分:2)

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

这是有效的,因为当您将textscan与文件标识符一起使用时,不会将文件标识符回退到文件的开头。它将它留在能够解析它的地方。因此,对textscan的下一次调用将从您离开的位置开始(减去您指定的任何标题行)

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)