我有一个文本文件,表上方有标题行,表下方有一个空行,然后是一个包含该表汇总统计信息的表。处理标题行很容易,因为大多数标准函数都有相应的选项(即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';
然后检查得到的表是否为空。