首页 > 解决方案 > 从文本文件中读取特定数据并计算结果

问题描述

我必须从文本文件中读取数据:

如何找到机器开启的总时间?当机器开启时,我可以获得单独的时间,但我似乎无法弄清楚如何添加它以获得总时间

注意:简单地添加它不会给出答案。总准时应为 31。

标签: matlabtimetext-files

解决方案


通过插值使用时间戳构建状态图


输出结果:

结果


读入数据:

这个问题有两个关键部分,读取数据和评估数据。该textscan()函数可用于读取格式规范的数据%d %f %s。这表明第 1 列应该作为整数读取/扫描,%d第 2 列作为浮点数,%f第 3 列作为字符串读取/扫描%s。所有这些数据都被扫描到Data本例中称为的元胞数组中。 数据数组结果


分析数据:

在将 的列Data分成各自的数组之后,可以评估对应于“开启”时间的行。这里该contains()函数用于评估Status数组/列中的行是否显示为“on”。当在数组中找到第二个参数时,该contains()函数返回真“1”,否则为第一个参数中的每个元素返回“0”。下一步是使用矩阵索引来索引数组以获取“on”Time的相应持续时间。Status从这里可以使用插值来构建状态图,其中“1”代表“ON”,“0”代表“OFF”。使用interp1()函数允许为一组新的点/轴插值信号。在这种情况下,我们需要在时间戳之间插入所有状态。使用之前的插值方法可以达到预期的效果。获取图表后,Interpolated_Binary_State可以根据文本文件中的时间戳获取总和以获取持续时间。 开/关状态图


完整脚本:

clear;
clc;

%Reading in the data as a cell array%
fileID = fopen('Text.txt', 'r');

Header = string(fgetl(fileID));
Data = textscan(fileID,'%d %f %s');

fclose(fileID);

%Splitting the data into specific columns%
Time = Data(:,1);
Time = Time{1,1};
Power = Data(:,2); 
Power = Power{1,1};
Status = Data(:,3);
Status = string(Status{1,1});

%Binary state graph%
Binary_State = contains(Status,"on");

%Interpolating the binary state graph for every interval between the
%timestamps%
Interpolated_Time = (0:max(Time));
Interpolated_Binary_State = interp1(double(Time),double(Binary_State),double(Interpolated_Time),'previous');

%Plotting the state graph%
stairs(Interpolated_Time,Interpolated_Binary_State);
title("State Graph ON (1) and OFF (0)");
xlabel("Time"); ylabel("State (ON/OFF)");
ylim([0 1.1]);
xticks(0:max(Time));

Total_On_Time = sum(Interpolated_Binary_State)
   

使用 MATLAB R2019b 运行


推荐阅读