我有一个包含多个观察部分的文本文件。每次,当新观察开始时,文件都会有一些关于后续数据的信息(如文件头)。
当我使用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'开头的数据行。
答案 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)