请将日志文件20150710.log按照时间对每行进行排序,如果时间已经出现过一次,再出现相同的时间用”\t”替换。(日志文件第一列为时间戳)
<?php
/**
* 第1步:load 函数
*把日志文件的每一行写入数组并返回
*/
function load($file) {
$handle = fopen($file,'r') or die('打开文件失败');//打开日志文件
//循环读取文件的每一行,并写入数组
while (!feof($handle)) {
$lines[]=fgets($handle,'4096');
}
fclose($handle); //关闭打开的文件资源
return $lines; //返回数组
}
/**
* 第2步:eliminate 函数
*对日志文件每一行读取的日志依照时间戳进行分类,出现相同的时间用"\t"替换
*/
function eliminate($lines) {
$new = array();
foreach($lines as $line) {
list($dul,) = explode(" ", $line);//切割出每一行日志的时间戳,并用list语句赋值给$dul
if(isset($new[$dul])) {
$line = str_replace($dul,"\t",$line);//判断时间戳是否重复,重复用制表符(Tab空格)代替
}
$new[$dul][] = $line;//对每一行日志,按照时间戳分类,放入同一数组下
}
return $new;//返回二维数组,数组的键为时间戳
}
/**
* 第3步:排序函数
按时间戳排序并依次写入字符串
* $new :需要排序的二维数组
*/
function qsort($new) {
$tmp ='';
ksort($new);//对二维数组排序
//双重循环把排好序的日志行写入到字符串中
foreach ($new as $values) {
foreach ($values as $value) {
$tmp .= $value."\n";
}
}
return $tmp;
}
$data=qsort(eliminate(load('20150710.log')));
file_put_contents('sh20150710.dat',$data);//把字符串写入到文件中
?>
其中,20150710.log
22367614 [info] 0.00 OK 0
22367611 [debug] 0.00 TEST 0
22367613 [info] 0.00 OK 0
22367613 [info] 2.44 OK 0
22367614 [info] 2.44 OK 0
22367612 [debug] 2.44 TEST 0
22367618 [error] 2.44 NULL 0
22367617 [info] 2.44 OK 0
22367618 [error] 2.44 NULL 0
22367610 [error] 2.44 NULL 0
22367613 [info] 2.44 OK 0
22367611 [info] 2.44 OK 0
22367612 [info] 2.44 OK 0
22367619 [info] 2.44 OK 0
22367618 [debug] 2.44 TEST 0
22367617 [debug] 2.44 NOTICE 0
22367610 [info] 2.44 OK 0
22367617 [error] 2.44 NULL 0
22367615 [info] 2.44 OK 0
22367614 [info] 2.44 OK 0
运行后得到的sh20150710.dat
22367610 [error] 2.44 NULL 0
[info] 2.44 OK 0
22367611 [debug] 0.00 TEST 0
[info] 2.44 OK 0
22367612 [debug] 2.44 TEST 0
[info] 2.44 OK 0
22367613 [info] 0.00 OK 0
[info] 2.44 OK 0
[info] 2.44 OK 0
22367614 [info] 0.00 OK 0
[info] 2.44 OK 0
[info] 2.44 OK 0
22367615 [info] 2.44 OK 0
22367617 [info] 2.44 OK 0
[debug] 2.44 NOTICE 0
[error] 2.44 NULL 0
22367618 [error] 2.44 NULL 0
[error] 2.44 NULL 0
[debug] 2.44 TEST 0
22367619 [info] 2.44 OK 0
注释1:
<?php
$dul1=array();
$dul1[] = explode(" ", "22367614 [info] 0.00 OK 0",1);//1表示拆分成1个数组
var_dump($dul1);echo "<hr>";//array(1) { [0]=> string(25) "22367614 [info] 0.00 OK 0" }
$dul2=array();
$dul2[] = explode(" ", "22367614 [info] 0.00 OK 0",2);//1表示拆分成2个数组
var_dump($dul2);echo "<hr>";//array(2) { [0]=> string(8) "22367614" [1]=> string(16) "[info] 0.00 OK 0" }
$dul3=array();
$dul3[] = explode(" ", "22367614 [info] 0.00 OK 0",3);//1表示拆分成3个数组
var_dump($dul3);echo "<hr>";//array(3) { [0]=> string(8) "22367614" [1]=> string(6) "[info]" [2]=> string(9) "0.00 OK 0" }
$dul4=array();
$dul4[] = explode(" ", "22367614 [info] 0.00 OK 0",4);//1表示拆分成4个数组
var_dump($dul4);echo "<hr>";//array(4) { [0]=> string(8) "22367614" [1]=> string(6) "[info]" [2]=> string(4) "0.00" [3]=> string(4) "OK 0" }
$dul5=array();
$dul5[] = explode(" ", "22367614 [info] 0.00 OK 0");//表示有多少,拆分多少
var_dump($dul5);echo "<hr>";//array(5) { [0]=> string(8) "22367614" [1]=> string(6) "[info]" [2]=> string(4) "0.00" [3]=> string(2) "OK" [4]=> string(1) "0" }
?>
注释2:文件中的换行符
linux,unix: \r\n
windows: \n
Mac OS : \r