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



我有一个文本文件,表上方有标题行,表下方有一个空行,然后是一个包含该表汇总统计信息的表。处理标题行很容易,因为大多数标准函数都有相应的选项(即readtable(。文件的长度并不总是相同的。readtable的问题是页脚表的列数少于主表,因此函数无法读取这些行并返回错误。

这是我在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,并逐个读取行以确定何时停止向表中添加,但这似乎效率很低。如何导入表行数未知且页脚行数未知的表?

首先,不要得出"看起来效率很低"的结论,除非你对它进行了分析或计时,发现它实际上太慢了,不符合你的需求。

不过,在这种情况下,您可以通过设置分隔的TextImportOptions对象的以下属性来更改MATLAB在发生错误时所采取的操作:

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';

然后检查得到的表是否为空。

相关内容

  • 没有找到相关文章

最新更新