2014-10-30 120 views
0

我期待報告一臺機器運行時間的百分比。我需要年初至今,過去兩週,昨天以及今天的運行時間百分比。我不想從錯誤的方向開始,所以我需要一些建議。我的數據在文本文件中看起來像這樣。日期時間計算C#

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並編寫我的圖表。 如果你看到更好的方法,那就是我正在尋找的。

+4

TimeSpan將是最佳選擇。 – deathismyfriend 2014-10-30 21:28:34

+0

我編輯過你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2014-10-30 21:59:25

+0

是否有一個源文件或類似於每個日期的文件? – Plutonix 2014-10-30 22:37:54

回答

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); }} 
} 

UPDATE 這顯然不是很精確因爲您可能有一段時間已經在比較日期(DateTime.Now.AddDays(-14))之前開始並在其之後結束。但我相信你會自己想出來。

+0

如果有兩個連續的「開」行或兩個連續的「關」行,代碼會發生什麼變化?你認爲這是一個合理的可能性,你應該補貼嗎? – 2014-10-31 03:23:12

+0

我不知道如何'乾淨'的文件。如果存在這種可能性,那麼它顯然變得更加複雜。提供的示例數據並未顯示這些情況。 – 2014-10-31 03:57:34

0

假設數據總是按時間順序排列,並以「ON」開始並以「OFF」結尾....這裏有一些非常簡單的代碼可以完成工作。

(我實際上並沒有從文件中讀取它,你可以實現,但是你想)

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; 
0

如果你有大量的數據,你可以將它們導入到SQL Server表。 創建誰顯示相關統計信息的視圖。 要在SQL服務器上查看,可以直接從excel連接。 這樣可以將數據存儲在一個地方,避免處理文件。