PHP去重实现:PHP去除大文本重复行的方法

目录
[隐藏]

PHP处理大文本可能会出现各种性能问题,一种简单的方法是利用PHP自带的array_unique数组去重函数,另一种简单方法则为利用关联数组特性实现。下面是相关实现方法主要代码,仅供参考。

1. 利用PHP数组去重函数array_unique实现

PHP代码
  1. /* 
  2. 文本重复字符串的去重 – 方法1 
  3. 利用explode和array_unique函数实现。 
  4. 存在问题:file_get_contents函数将文件全部读入内存处理,这样处理速度较快,但大文件会出现内存溢出问题 
  5. */  
  6. function duplicate_remove_1($file_input$file_output)  
  7. {  
  8.     $content = file_get_contents($file_input);  
  9.     if(!$content)  
  10.     {  
  11.         return 0;     
  12.     }  
  13.     //符号过滤与格式处理(处理为以逗号分割的字符串)  
  14.     //$pattern = "/[ '.:;*?~`!@#$%^&+=-)(<>{}]|]|[|/|\|"||/";  
  15.     //$content = preg_replace($pattern, '', $content);    //英文符号过滤  
  16.     $array = explode(',', $content); 
  17.     $new_array=array_values(array_unique($array));//消除重复行 
  18.     $array = NULL; 
  19.     $num = count($new_array) – 1; 
  20.     
  21.     $content = implode("rn",$new_array); 
  22.     $new_array = NULL; 
  23.     
  24.     $content=preg_replace('/($s*$)|(^s*^)/m','',$content); //消除空行  
  25.     $_bool = file_put_contents("{$file_output}",$content);  
  26.     if(!$_bool)
        {
            return 0;
        }
  27.     $content = NULL;  
  28.      
  29.     return $num;  
  30. }  

2. 利用PHP关联数组特性实现

PHP代码
  1. /* 
  2. 文本重复字符串的去重 – 方法2 
  3. 利用关联数组特性,将每个字符串作为下标,遍历文件进行赋值 
  4. 存在问题:使用fopen函数循环读取文件,i/o次数多,处理速度慢 
  5. */  
  6. function duplicate_remove($file_input$file_output)  
  7. {  
  8.     $fp = fopen($file_input'r');  
  9.     if(!$fp)  
  10.     {  
  11.         return 0;  
  12.     }  
  13.      
  14.     $array = array();  
  15.     while(!feof($fp)) {  
  16.         $line = fgets($fp, 1024);  
  17.         $array_line = explode(','$line);  
  18.         foreach($array_line as $v)    //以关联数组的方式实现去重  
  19.         {  
  20.             $array[$v] = $v;  
  21.         }  
  22.     }  
  23.     fclose($fp);  
  24.      
  25.     $content = implode("rn",$array);  
  26.     $num=count($array) -1;  
  27.     $array = NULL;  
  28.      
  29.     $content=preg_replace('/($s*$)|(^s*^)/m','',$content); //消除空行  
  30.     $_bool = file_put_contents("{$file_output}",$content);  
  31.     if(!$_bool)
        {
            return 0;
        }
  32.     $content = NULL;  
  33.      
  34.     return $num;  
  35. }  

其他参考:php简单去除大型文本重复

XML/HTML代码
  1.  <?php  
  2. error_reporting(E_ALL & ~E_NOTICE);  
  3. @ini_set('memory_limit','-1');  
  4. set_time_limit(0);  
  5. echo" 去除文本重复工具"."rnrn";  
  6. echo"n"."输入要整理的文件:"."n";  
  7. $dic=trim(fgets(STDIN));  
  8. /*while (!feof($dic)){  
  9.         $file[]=stream_get_line($fp,65535,"rn");  
  10. }  
  11.  */  
  12.   
  13. $filefile=file($dic);  
  14. $array=preg_replace('/($s*$)|(^s*^)/m','',$file); //消除空行  
  15. $new_array=array_values(array_unique($array));//消除重复行  
  16. $new_filename="new_". basename($dic);  
  17.   
  18. if(file_put_contents("$new_filename",join("rn",$new_array))){  
  19.   
  20.     $num=count($file);  
  21.     $new_num=count($new_array);  
  22.     $counts=$num-$new_num;  
  23.     $files=dirname(__FILE__).DIRECTORY_SEPARATOR.$new_filename;  
  24.   
  25.     echo<<<INFO  
  26.      +———————————————-+  
  27.      | [+] 去除重复完毕!  
  28.      | [+] 整理后的文件为:$files  
  29.      | [+] 原始字典数量:$num 行  
  30.      | [+] 整理后为:$new_num 行  
  31.      | [+] 共替换了$counts 行  
  32.      +———————————————-+  
  33.     INFO;  
  34. }  
  35. else{  
  36.     echo"——————————————"."rn";  
  37.     echo"[*] 错误!"."rnrn";  
  38.     echo"[*] 找不到文件!请检查输入路径是否存在!"."rn";  
  39.     echo"——————————————"."rn";  
  40.     exit();  
  41. }  
  42. ?>  

 

点赞 (0)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.