php подсчитываем количество дублей в файле и записываем в базу
Рубрика: Новости -> Скрипты -> phpПятница, 10 сентября 2010 г.
Просмотров: 7676
Настроение: неочень((, но надеюсь на лучшее
В колонках звучит: 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);
?>если кто сможет оптимизировать код, либо показать готовый пример который будет лучше, то я буду очень рад).
Комментариев: 2
> если кто сможет оптимизировать код
Надо предварительно строить индекс по первому (или первым n-символам).
В этом случае при огромном файле он не будет проверять то, где точно нету ничего.
Спсибо))), я учту если понадобится этот код использовать снова.