如何在 MATLAB 中导入带有页脚行的 table?

How can I import a table in MATLAB with footer rows?

我有一个文本文件,在 table 上方有 header 行,在 table 下方是一个空行,然后 table 包含 table。处理 header 行很容易,因为大多数标准函数都有一个选项(即 readtable)。文件的长度并不总是相同的。 readtable 的问题是页脚 table 的列少于主 table 的列,因此该函数无法读取这些行并且 returns 出错。

这是我使用 readtable:

得到的错误
Error using readtable (line 216)
Reading failed at line 2285. All lines of a text file must have the same number of delimiters. Line 2285 has 0 delimiters, while preceding lines
have 24.

Note: readtable detected the following parameters:
'Delimiter', '\t', 'HeaderLines', 21, 'ReadVariableNames', true, 'Format', '%T%f%f%f%q%f%f%f%f%f%f%q%f%f%f%f%f%f%f%f%f%f%f%f%f'

这是我想出的替代解决方案:

dataStartRow = 23;
numRows = length(readmatrix(filePath, 'NumHeaderLines',0));
dataEndRow = numRows - 8;

opts = detectImportOptions(filePath);
opts.DataLines = [dataStartRow, dataEndRow];
dataTable = readtable(filePath, opts);

这行得通,但我有另一个文件的页脚行数不同,我不知道如何在不对页脚行数进行硬编码的情况下处理这个问题。

我考虑过使用 fgetl,并逐行读取以确定何时停止添加到 table,但这似乎效率很低。我如何导入此 table 行数未知且页脚行数未知的 table?

首先,不要下结论说 'seems very inefficient' 除非您对它进行分析或计时并发现它实际上对您的要求来说太慢了。

虽然在这种情况下,您可以更改 MATLAB 在发生错误时采取的操作,方法是设置 delimitedTextImportOptions object 的 属性:

opts = detectImportOptions(filePath);
opts.ImportErrorRule = 'omitrow'; # ignore any lines that don't match the detected pattern
dataTable = readtable(filePath, opts);

如果您经常使用此代码读取新数据,我会考虑对 dataTable 进行某种验证以确保它与您的预期一致,以防新文件导致detectImportOptions 出于某种原因给出不同的结果。例如,如果您知道列数及其格式应始终相同,则可以指定

opts.Format = '%T%f%f%f%q%f%f%f%f%f%f%q%f%f%f%f%f%f%f%f%f%f%f%f%f';

然后检查生成的 table 是否不为空。