如何在Matlab中读取并合并含指定字符串的多日志文件
在MATLAB中合并含特定字符串的日志文件
我来帮你完善这个脚本,实现批量合并文件夹中名称包含PILOT的.log文件的需求,下面是完整的实现方案和优化说明:
核心步骤梳理
- 筛选出所有符合命名规则的目标日志文件
- 逐个读取每个文件的内容
- 将所有内容整合写入一个新的合并日志文件
完整可运行代码
% 1. 筛选当前文件夹中名称包含"PILOT"的.log文件 pilotFiles = dir('*PILOT*.log'); % 先检查是否找到目标文件,避免后续报错 if isempty(pilotFiles) error('未找到任何包含PILOT的.log文件,请检查文件名或路径'); end % 2. 定义合并后的日志文件名,也可以自定义命名 mergedLogName = 'merged_PILOT_logs.log'; % 打开合并文件:'w'表示覆盖原有内容,若要追加到已有文件可改为'a' mergedFileID = fopen(mergedLogName, 'w'); % 3. 遍历每个目标文件并合并内容 for filIdx = 1:length(pilotFiles) % 获取当前文件名,直接访问name属性避免原代码char转换补空格的问题 currentFileName = pilotFiles(filIdx).name; % 尝试打开当前日志文件 currentFileID = fopen(currentFileName, 'r'); if currentFileID == -1 warning('无法打开文件:%s,将跳过该文件', currentFileName); continue; end % 读取当前文件的全部内容(适用于文本格式日志) fileContent = fread(currentFileID, '*char'); % 将内容写入合并文件 fwrite(mergedFileID, fileContent); % 可选:在不同源文件之间添加分隔线,方便后续区分内容来源 fwrite(mergedFileID, sprintf('\n===================== 来自文件:%s =====================\n', currentFileName)); % 关闭当前文件,释放资源 fclose(currentFileID); end % 关闭合并文件 fclose(mergedFileID); disp(['合并完成!已生成合并日志:', mergedLogName]);
代码优化说明
- 规避了原代码中
char(files)的坑:当文件名长度不一致时,char会自动补空格,导致读取文件名出错,直接用pilotFiles(filIdx).name更可靠 - 增加了错误处理:提前检查是否找到目标文件,处理无法打开的异常文件
- 灵活的写入模式:需要追加内容时只需修改
fopen的模式参数 - 可选分隔线:方便后续快速区分不同源文件的内容边界
针对你原有代码的补充(如果日志是结构化表格)
如果你原代码中noofColumns = ...是要处理固定列数的表格日志,可以用下面的方式确保格式一致后再合并:
% 假设预期列数为5,可根据实际情况修改 expectedColumns = 5; % 在遍历循环中替换读取逻辑 currentData = dlmread(currentFileName); if size(currentData, 2) == expectedColumns dlmwrite(mergedLogName, currentData, '-append'); else warning('文件%s的列数不符合要求,跳过该文件', currentFileName); end
内容的提问来源于stack exchange,提问作者Mandarc




