日志文件整理(PHP面试题)

来源:互联网 发布:ppp项目咨询 知乎 编辑:程序博客网 时间:2024/05/02 18:02

请将日志文件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.log22367614 [info] 0.00 OK 022367611 [debug] 0.00 TEST 022367613 [info] 0.00 OK 022367613 [info] 2.44 OK 022367614 [info] 2.44 OK 022367612 [debug] 2.44 TEST 022367618 [error] 2.44 NULL 022367617 [info] 2.44 OK 022367618 [error] 2.44 NULL 022367610 [error] 2.44 NULL 022367613 [info] 2.44 OK 022367611 [info] 2.44 OK 022367612 [info] 2.44 OK 022367619 [info] 2.44 OK 022367618 [debug] 2.44 TEST 022367617 [debug] 2.44 NOTICE 022367610 [info] 2.44 OK 022367617 [error] 2.44 NULL 022367615 [info] 2.44 OK 022367614 [info] 2.44 OK 0运行后得到的sh20150710.dat22367610 [error] 2.44 NULL 0         [info] 2.44 OK 022367611 [debug] 0.00 TEST 0         [info] 2.44 OK 022367612 [debug] 2.44 TEST 0         [info] 2.44 OK 022367613 [info] 0.00 OK 0         [info] 2.44 OK 0         [info] 2.44 OK 022367614 [info] 0.00 OK 0         [info] 2.44 OK 0         [info] 2.44 OK 022367615 [info] 2.44 OK 022367617 [info] 2.44 OK 0         [debug] 2.44 NOTICE 0         [error] 2.44 NULL 022367618 [error] 2.44 NULL 0         [error] 2.44 NULL 0         [debug] 2.44 TEST 022367619 [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

http://www.jianshu.com/p/7e47a3c904e4

1 0