转换csv数据 - 连续到离散步骤

时间:2015-10-04 09:44:03

标签: perl csv transformation

我有一些工作(或任何项目/行动)及其开始和结束日期的列表。 现在,对于每天的每一分钟,我需要知道有多少工作是活跃的。

所以输入看起来像这样: (实际上我直接把它作为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

输出应如下所示:

注意:刚刚添加的作业名称是清晰的,在实际输出中我只对每分钟活动作业的数量感兴趣,而不是哪些作业处于活动状态

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不可用,因此不幸的是不能选择。感谢您提供任何暗示!

1 个答案:

答案 0 :(得分:0)

您需要如何解决这个问题:

  • 解析输入文件。 Text::CSV是一种选择,但在您的行的分隔符上使用split将作为权宜之计。
  • 使用Time::Piecestrptime将您的开始/停止时间转换为您可以在数字上进行比较的内容。 (epoch)。
  • 将这些存储在数据结构中。如果作业名称是唯一的,则hash可能是作业的工具。
  • 计算时段的开头和结尾(也在epoch中)。 Time::Piece也可以为您做到这一点。
  • 查找散列中具有startend的元素,这些元素属于时间窗口。 grep可以为您完成此操作。

注意 - 如果您没有CPAN Text::CSV可能无法获得。 Time::Piece应该是,因为它是5.9.5的核心。否则,可能发现您可以使用date命令来复制该功能。