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

10,878次阅读
一条评论

共计 2218 个字符,预计需要花费 6 分钟才能阅读完成。

提醒:本文最后更新于2019-11-05 16:59,文中所关联的信息可能已发生改变,请知悉!

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

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

/*
文本重复字符串的去重 – 方法1
利用explode和array_unique函数实现。
存在问题:file_get_contents函数将文件全部读入内存处理,这样处理速度较快,但大文件会出现内存溢出问题
*/
function duplicate_remove_1($file_input, $file_output)
{
$content = file_get_contents($file_input);
if(!$content)
{
return 0;
}
//符号过滤与格式处理(处理为以逗号分割的字符串)
//$pattern = "/[ '.:;*?~`!@#$%^&+=-)(<>{}]|]|[|/|\|"||/";
//$content = preg_replace($pattern, '', $content); //英文符号过滤
$array = explode(',', $content);
$new_array=array_values(array_unique($array));//消除重复行
$array = NULL;
$num = count($new_array) – 1;
$content = implode("rn",$new_array);
$new_array = NULL;
$content=preg_replace('/($s*$)|(^s*^)/m','',$content); //消除空行
$_bool = file_put_contents("{$file_output}",$content);
if(!$_bool)
{
return 0;
}
$content = NULL;
return $num;
}

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

/*
文本重复字符串的去重 – 方法2
利用关联数组特性,将每个字符串作为下标,遍历文件进行赋值
存在问题:使用fopen函数循环读取文件,i/o次数多,处理速度慢
*/
function duplicate_remove($file_input, $file_output)
{
$fp = fopen($file_input, 'r');
if(!$fp)
{
return 0;
}
$array = array();
while(!feof($fp)) {
$line = fgets($fp, 1024);
$array_line = explode(',', $line);
foreach($array_line as $v) //以关联数组的方式实现去重
{
$array[$v] = $v;
}
}
fclose($fp);
$content = implode("rn",$array);
$num=count($array) -1;
$array = NULL;
$content=preg_replace('/($s*$)|(^s*^)/m','',$content); //消除空行
$_bool = file_put_contents("{$file_output}",$content);
if(!$_bool)
{
return 0;
}
$content = NULL;
return $num;
}

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

< ?php
error_reporting(E_ALL & ~E_NOTICE);
@ini_set('memory_limit','-1');
set_time_limit(0);
echo" 去除文本重复工具"."rnrn";
echo"n"."输入要整理的文件:"."n";
$dic=trim(fgets(STDIN));
/*while (!feof($dic)){
$file[]=stream_get_line($fp,65535,"rn");
}
*/
$filefile=file($dic);
$array=preg_replace('/($s*$)|(^s*^)/m','',$file); //消除空行
$new_array=array_values(array_unique($array));//消除重复行
$new_filename="new_". basename($dic);
if(file_put_contents("$new_filename",join("rn",$new_array))){
$num=count($file);
$new_num=count($new_array);
$counts=$num-$new_num;
$files=dirname(__FILE__).DIRECTORY_SEPARATOR.$new_filename;
echo<<<INFO
+———————————————-+
| [+] 去除重复完毕!
| [+] 整理后的文件为:$files
| [+] 原始字典数量:$num
| [+] 整理后为:$new_num
| [+] 共替换了$counts
+———————————————-+
INFO;
}
else{
echo"——————————————"."\r\n";
echo"[*] 错误!"."\r\n\r\n";
echo"[*] 找不到文件!请检查输入路径是否存在!"."\r\n";
echo"——————————————"."\r\n";
exit();
}
?>

正文完
 0
任侠
版权声明:本站原创文章,由 任侠 于2012-09-03发表,共计2218字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(一条评论)
验证码
赵严冬 评论达人 LV.1
2019-10-25 14:52:13 回复
Google Chrome 77.0.3865.120 Google Chrome 77.0.3865.120 Mac OS X 10.14.3 Mac OS X 10.14.3

第二方法还是文本太大,数组还是回变得很大,仍然有数组溢出的风险

 Macintosh  Chrome  中国浙江省杭州市电信