每小时总结报告

时间:2014-05-13 18:05:19

标签: regex

我每小时都有一份物品清单,但每小时都没有,所以我的清单上有漏洞。我每小时都有一个空白模板,但任何类型的差异工具都不会匹配具有相同时间和日期的行。如何填写我的清单以获得空闲时间?我正在考虑与正则表达式匹配的计数,直到计数,并用计数替换模板中的0。

Counted List
4/1/2014,4:00 PM,5
4/1/2014,6:00 PM,3
4/1/2014,7:00 PM,4
4/1/2014,9:00 PM,5
4/1/2014,10:00 PM,4
4/2/2014,7:00 AM,3
4/2/2014,8:00 AM,3

Template
4/1/2014,12:00 AM,0
4/1/2014,1:00 AM,0
4/1/2014,2:00 AM,0
4/1/2014,3:00 AM,0
4/1/2014,4:00 AM,0

1 个答案:

答案 0 :(得分:1)

<强> PHP:

$regex = '~(\d{1,2}/\d{1,2}/\d{4}),(\d{1,2}:00 [AP]M),(\d+)~';
$oneHour = new DateInterval('PT1H');

$lines = explode("\n", $data);
$count = count($lines);

$final = array();
foreach($lines as $key => $line) {
    preg_match($regex, $line, $currentMatches);
    $final[] = $currentMatches[0];

    if($key < $count - 1) {
        preg_match($regex, $lines[$key + 1], $nextMatches);

        $currentDate = new DateTime($currentMatches[1] . ' ' . $currentMatches[2]);
        $nextDate = new DateTime($nextMatches[1] . ' ' . $nextMatches[2]);

        while($nextDate->getTimestamp() - $currentDate->getTimestamp() != 60 * 60) {
            $currentDate = $currentDate->add($oneHour);
            $final[] = $currentDate->format('n/j/Y,g:i A,0');
        }
    }
}
$data = implode("\n", $final);

输出(使用输入作为$ data):

4/1/2014,4:00 PM,5
4/1/2014,5:00 PM,0
4/1/2014,6:00 PM,3
4/1/2014,7:00 PM,4
4/1/2014,8:00 PM,0
4/1/2014,9:00 PM,5
4/1/2014,10:00 PM,4
4/1/2014,11:00 PM,0
4/2/2014,12:00 AM,0
4/2/2014,1:00 AM,0
4/2/2014,2:00 AM,0
4/2/2014,3:00 AM,0
4/2/2014,4:00 AM,0
4/2/2014,5:00 AM,0
4/2/2014,6:00 AM,0
4/2/2014,7:00 AM,3
4/2/2014,8:00 AM,3

<强>解释

首先,$data是您的输入数据(来自文件?),其中包含由新行分隔的日期/时间/计数字符串。然后我们使用表达式$regex = '~(\d{1,2}/\d{1,2}/\d{4}),(\d{1,2}:00 [AP]M),(\d+),假设您的数据始终采用mm/dd/YYYY,hh:00 XM,#格式。这里最重要的是,基于你的例子,我们根本不关心会议记录,而且对格式非常严格。

此外,我们 假设 每一行都会匹配我们的正则表达式。如果没有,你需要在这里添加一些条件。我们首先匹配当前行并将其添加到新数组中。然后,如果我们不在数组的末尾,我们匹配下一行。现在我们比较这些日期,并循环通过while,下一个日期不是当前日期的1小时。我们更新当前日期,向新数组添加一个计数为0的占位符,然后在下一个日期是未来一小时时停止。我们将在foreach的下一次迭代中使用此行。


<强>链接: