2015-10-04 95 views
0

我有一些作業(或任何項目/動作)及其開始和結束日期的列表。 現在每天的每一分鐘,我都需要知道有多少活動是活動的。轉換csv數據 - 連續到離散步驟

因此,輸入如下: (其實我把它直接作爲CSV)

Jobname |  Start  |   End   
---------------------------------------------------  
JobA | 04/10/2015 08:00:00 | 04/10/2015 09:00:00 
JobB | 04/10/2015 10:00:00 | 04/10/2015 10:00:59 
JobC | 04/10/2015 10:00:00 | 04/10/2015 11:00:00 

的輸出應是這樣的:

注意:Jobnames只是增加了clearity,在真正的產出我只對每分鐘活動作業的數量感興趣,而不是哪些作業是活動的

Time    | Number of active jobs 
---------------------------------------------------  
04/10/2015 00:00:00 | 0 
[..] 
04/10/2015 08:00:00 | 1 (JobA) 
04/10/2015 08:01:00 | 1 (JobA) 
[..] 
04/10/2015 09:00:00 | 1 (JobA) 
04/10/2015 09:01:00 | 0 
[..] 
04/10/2015 09:59:00 | 0 
04/10/2015 10:00:00 | 2 (JobB, JobC) 
04/10/2015 10:01:00 | 1 (JobC) 
[..] 
04/10/2015 11:00:00 | 1 (JobC) 
04/10/2015 11:01:00 | 0 
[..] 
04/10/2015 23:59:00 | 0 

這怎麼能用Perl來實現?請注意,CPAN不可用,因此很不幸,這不是一個選項。感謝您的任何提示!

+0

我可能會使用一個函數來將時間轉換爲秒或分鐘,而一個用於相反。已經存在於cpan中的,所以不是可能引入錯誤,而是使用它。 DateTime,Time :: Local。 然後,我會解析給出的日期,將它們的轉換後的值放在散列中,然後每分鐘從該散列中刪除結束時間過去的作業,並打印所有開始時間<=當前分鐘的作業(或者,如果作業名稱不要緊,只要grep所有的開始時間<= current並打印該數字)。 – bytepusher

+1

如果您先嚐試自己解決問題,您將得到更好的答案。我會指出'Time :: Piece'是一個核心模塊。 – Sobrique

回答

0

如何,你需要接近,這將是:

  • 解析輸入文件。 Text::CSV是一種選擇,但在您的行的分隔符上使用split將作爲權宜之計。
  • 使用Time::Piecestrptime將您的開始/停止時間轉換爲可以用數字比較的東西。 (epoch)。
  • 將這些存儲在數據結構中。如果工作名稱是唯一的,hash可能是該工作的工具。
  • 計算您的時間段的開始和結束(也在epoch)。 Time::Piece也可以爲你做到這一點。
  • 查找散列中有startend落在時間窗口內的元素。 grep可以爲你做到這一點。

注 - 如果您沒有CPANText::CSV可能無法使用。 Time::Piece應該是,因爲它是5.9.5的核心。否則,您可能會找到您可以使用date命令複製功能。