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

请将日志文件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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值