Matlab:移除文件末尾SUB字符以解决importdata导入报错问题
解决Matlab中importdata因文件末尾SUB字符报错的问题
你遇到的这个vertcat维度不匹配错误,本质是因为文件末尾的SUB字符(ASCII码26)被importdata当成了额外的一行数据,但这行没有和前面数据匹配的列数,拼接时就触发了维度不一致的报错。你说的直接移除SUB字符的思路完全正确,下面给你两种实用的实现方法:
方法一:Matlab自动清理并读取文件
不需要手动修改原始文件,用代码全程自动处理,适合批量处理场景:
% 读取目标日志文件的全部内容 fid = fopen(logFile, 'r'); fileContent = fread(fid, '*char')'; % 转换为字符串格式 fclose(fid); % 移除文件中的SUB字符(ASCII码对应char(26)) cleanedContent = strrep(fileContent, char(26), ''); % 将清理后的内容写入临时文件 tempFile = tempname; fid = fopen(tempFile, 'w'); fprintf(fid, '%s', cleanedContent); fclose(fid); % 用importdata读取清理后的临时文件 A = importdata(tempFile, '\t', 1); % 可选:处理完成后删除临时文件 delete(tempFile);
方法二:手动预处理文件(适合少量文件)
如果你的日志文件数量不多,手动清理更直接:
- 用专业文本编辑器(比如Notepad++、Sublime Text)打开目标文件
- 开启显示所有隐藏字符的功能(Notepad++路径:
视图>显示符号>显示所有字符) - 找到文件末尾的SUB字符(通常显示为
SUB标记或一个小方块),直接删除后保存 - 再运行你原来的
importdata代码就能正常执行了
额外优化:批量检查文件是否含SUB字符
如果需要批量处理文件,可以先加个检查逻辑,提前识别问题文件:
fid = fopen(logFile, 'r'); fileContent = fread(fid, '*char')'; fclose(fid); if contains(fileContent, char(26)) disp(['检测到文件 ', logFile, ' 包含SUB字符,将自动清理']); % 这里调用上面的清理读取逻辑 else disp(['文件 ', logFile, ' 无SUB字符,直接读取']); A = importdata(logFile, '\t', 1); end
内容的提问来源于stack exchange,提问作者Matthias Pospiech
相关产品推荐
相关产品推荐

