我希望报告机器运行时间的百分比。我需要年初,最近两周,昨天,以及今天的运行时间百分比。我不想从错误的方向开始,所以我需要一些建议。我的数据在文本文件中看起来像这样。
10/21/2014 07:45:31,ON
10/21/2014 07:45:41,OFF
10/21/2014 07:46:11,ON
10/21/2014 07:46:21,OFF
10/21/2014 07:46:41,ON
10/21/2014 07:46:51,OFF
10/21/2014 07:47:12,ON
10/21/2014 07:47:22,OFF
10/21/2014 14:17:35,ON
10/21/2014 14:17:55,OFF
10/21/2014 14:18:25,ON
10/21/2014 14:18:35,OFF
10/21/2014 15:51:21,ON
10/21/2014 15:51:51,OFF
10/21/2014 15:53:01,ON
10/21/2014 15:58:22,OFF
10/21/2014 15:58:32,ON
10/21/2014 16:12:33,OFF
10/21/2014 16:12:42,ON
10/21/2014 16:16:33,OFF
10/21/2014 16:16:43,ON
我打算用C#写这个。我的想法是使用c#计算它并将此数据写入另一个逗号分隔的文本文件,我可以将其带入excel。我在excel中做到了这一点,但是速度很慢,我将有一年的数据要紧缩。 我希望最终绕过excel并编写我的图表。 如果你看到更好的方式,那就是我要找的。 p>
答案 0 :(得分:0)
一个可能指向方向的小例子:
// Get all the lines
var lines = File.ReadAllLines("myfile.txt");
// Create a list of OnPeriods (see below) which then can be used for statistics
var onPeriods = new List<OnPeriod>();
// Make sure we're starting with an 'ON' line, otherwise ignore the first line and take the 2nd
var start = lines[0].Contains("ON") ? 0 : 1;
for (int i = start; i < lines.Count(); i = i+2)
{
// Parse out datetimes
var dateOn = DateTime.Parse(lines[i].Split(',')[0]);
var dateOff = DateTime.Parse(lines[i + 1].Split(',')[0]);
// Add period
onPeriods.Add(new OnPeriod{OnDate = dateOn, OffDate = dateOff});
}
// Now you can do all kind of magic like
var secondsOnInTheLastTwoWeeks = onPeriods.Where(p => p.OnDate > DateTime.Now.AddDays(-14)).Select(p => p.OnTime.Seconds).Sum();
为此你需要小助手类OnPeriod:
public class OnPeriod
{
public DateTime OnDate { get; set; }
public DateTime OffDate { get; set; }
public TimeSpan OnTime {get { return OffDate.Subtract(OnDate); }}
}
<强>更新强> 这显然不是很精确,因为你可以在比较日期之前已经开始一段时间(DateTime.Now.AddDays(-14))并在它之后结束。但我相信你会自己解决这个问题。
答案 1 :(得分:0)
假设数据始终按时间顺序排列,并以&#34; ON&#34;开头。并以&#34; OFF&#34; ....结束,这是一些非常简单的代码,可以完成工作。
(我实际上并没有从文件中读取它,你可以随意实现它)
string[] times = { "10/21/2014 07:45:31,ON",
"10/21/2014 07:45:41,OFF",
"10/21/2014 07:46:11,ON",
"10/21/2014 07:46:21,OFF",
"10/21/2014 07:46:41,ON",
"10/21/2014 07:46:51,OFF",
"10/21/2014 07:47:12,ON",
"10/21/2014 07:47:22,OFF",
"10/21/2014 14:17:35,ON",
"10/21/2014 14:17:55,OFF",
"10/21/2014 14:18:25,ON",
"10/21/2014 14:18:35,OFF",
"10/21/2014 15:51:21,ON",
"10/21/2014 15:51:51,OFF",
"10/21/2014 15:53:01,ON",
"10/21/2014 15:58:22,OFF",
"10/21/2014 15:58:32,ON",
"10/21/2014 16:12:33,OFF",
"10/21/2014 16:12:42,ON",
"10/21/2014 16:16:33,OFF"
};
TimeSpan upTime = new TimeSpan();
for (int i = 0; i < times.Length; i += 2)
{
var start = times[i].Split(',');
var stop = times[i + 1].Split(',');
upTime += DateTime.Parse(stop[0]) - DateTime.Parse(start[0]);
}
var begin = DateTime.Parse(times.First().Split(',')[0]);
var end = DateTime.Parse(times.Last().Split(',')[0]);
var totalTime = end - begin;
var percentUp = upTime.TotalSeconds / totalTime.TotalSeconds;
答案 2 :(得分:0)
如果您有大量数据,可以将它们导入到sql server表中。 创建显示相关统计信息的人员视图。 要在SQL服务器上查看,可以直接从excel连接。 通过这种方式,可以将数据存储在一个地方,并避免处理文件。