从.dat文件提取时间数据:Octave处理YYMMDD格式日期问题
Octave处理真空腔.dat日志文件问题解决方案
问题1:dlmread读取时间仅获取冒号前数字
dlmread仅支持读取数值型数据,带冒号的时间属于字符串格式,直接读取会被截断。解决方案:
改用textscan或readtable(Octave 5.0及以上版本支持)按字符串读取时间列,再单独处理:
fid = fopen('vacuum_log.dat', 'r'); % 假设每行格式:日期;时间;压力;温度,跳过前4行表头 data = textscan(fid, '%s %s %f %f', 'Delimiter', ';', 'HeaderLines', 4); fclose(fid); time_str = data{2}; % 获取时间字符串数组
问题2:Octave的datestr不支持YYMMDD格式
Octave的datenum支持自定义格式解析YYMMDD,无需依赖datestr:
- 解析日期字符串:
date_str = data{1}; % 获取YYMMDD格式日期字符串 date_num = datenum(date_str, 'yymmdd'); % 转成日期序列号 - 若需将日期序列号转回YYMMDD格式字符串,用
strftime替代datestr:date_yyyymmdd = strftime('%y%m%d', date_num);
问题3:csv2cell返回向量而非矩阵
csv2cell返回向量通常是因为文件每行的分隔列数不一致,或未指定正确分隔符。解决方案:
- 先确认日志文件每行的分号分隔列数完全一致,再用
textscan读取后手动构造cell矩阵:% 从textscan结果构造cell矩阵 cell_data = [data{1}, data{2}, num2cell(data{3}), num2cell(data{4})]; - 若必须用csv2cell,指定分隔符并检查文件格式:
cell_data = csv2cell('vacuum_log.dat', ';', 'HeaderLines', 4);
问题4:textscan返回空向量或仅含文件名
核心错误是未正确打开文件句柄,直接传入文件名字符串无效。正确流程:
fid = fopen('vacuum_log.dat', 'r'); if fid == -1 error('无法打开日志文件'); end % 匹配实际列数的格式字符串,比如4列:日期;时间;压力;温度 data = textscan(fid, '%s %s %f %f', 'Delimiter', ';', 'HeaderLines', 4); fclose(fid);
若仍返回空,检查表头行数是否正确,或格式字符串是否与每行内容匹配(比如压力/温度是否为数值型,无异常字符)。
额外需求:转为可执行文件+输出文件+生成图表
1. 转为可执行文件
- 在脚本开头添加shebang行:
#!/usr/bin/env octave - 赋予执行权限:
chmod +x vacuum_process.m - 直接运行:
./vacuum_process.m
2. 输出修改后的文件
处理完数据后,用dlmwrite写入:
% 合并日期、时间、压力、温度为矩阵 full_time = datenum(strcat(date_str, ' ', time_str)); processed_data = [full_time, data{3}, data{4}]; dlmwrite('processed_vacuum_log.dat', processed_data, 'Delimiter', ';', 'Precision', '%.6f');
3. 生成温度/压力随时间变化的图表
figure; plot(full_time, data{3}, 'b-', 'LineWidth', 1.5); hold on; plot(full_time, data{4}, 'r--', 'LineWidth', 1.5); datetick('x', 'yyyy-mm-dd HH:MM'); % 设置x轴时间格式 xlabel('时间'); ylabel('数值'); legend('压力', '温度'); grid on; saveas(gcf, 'pressure_temperature_trend.png'); % 保存图表
内容的提问来源于stack exchange,提问作者user22633558
相关产品推荐
相关产品推荐

