php подсчитываем количество дублей в файле и записываем в базу

Рубрика: Новости -> Скрипты -> php
Пятница, 10 сентября 2010 г.
Просмотров: 1565
Настроение: неочень((, но надеюсь на лучшее
В колонках звучит: E-type - Angels crying [radio version]
Подписаться на комментарии по RSS

Думал долго как сделать нормальный подсчет количества повторений строк в файлах, удалять их дубли и писать сколько их было.

Написал простенький скрипт который ищет все дубли строк в одном файле и записывает их в другой файл в виде

строка1|количество дублей

строка2|количество дублей

..

получился скрипт который использует оперативную память по минимому и не загружает ее всеми данными, но за счет этого с большими данными скрипт будет обрабатываться долго(((.

поиск дублей происходит в циклах, и при больших объемах информации циклов становиться все больше и больше, но другого нормального решения для поиска дублей я ненашел((.

Есть какаято функция в php которая подсчитывает и выводит все дубли в массиве, но не в файле, а это значить что оперативная память будет хранить весь этот массив данных, что не есть гуд(.

кароче вот скрипт, я попробую еще ченить придумать как его оптимизировать под скорость, но пока идей нет((.

<?php
$fileopen = 'links.txt';//файл в котором будем искать дубли
$filesavebase = 'base.txt';//файл в который будем записывать все данные
			$links_file=fopen($fileopen, 'r');//открываем файл для сравнения с поиском
			$links_file_search=fopen($fileopen, 'r');//открываем файл для поиска
			$base_file=fopen($filesavebase, 'a+');//открываем файл для записи базы
			if ($links_file)
			{
				while(!feof($links_file))
				{
					$data = trim(fgets($links_file));//переход к след строке сравнения с поиском
					
		//поиск в базе
		fseek($base_file, 0);//сбрасываем указатель в файле базы на начало
		while(!feof($base_file))
		{
			$database = fgets($base_file);//переход к след строке базы
			//проверка на повторение с базой
			if (stristr($database,$data))
			{
			$goto='0';
			}
		}
//проверяем можем ли мы продожать или нет	
if($goto != '0'){
	//поиск повторений
	$counter = 0;
	while(!feof($links_file_search))
	{
	$str = fgets($links_file_search);
		if (stristr($str,$data))
		{
		$counter++;
		}
	}
	fseek($links_file_search, 0);//сбрасываем указатель в файле поиска на начало
//записываем в базу
$dataputs= trim($data).'|'. trim($counter)."\r\n";
fwrite($base_file, $dataputs);
		  }
$goto='1';//переназначаем переменую
				 }
			}
//закрываем все открытые файлы
			fclose($links_file);
			fclose($links_file_search);
			fclose($base_file);
?> 

если кто сможет оптимизировать код, либо показать готовый пример который будет лучше, то я буду очень рад).

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)