2015-10-04 92 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命令复制功能。