Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   вопрос) (https://forum.antichat.xyz/showthread.php?t=95003)

j0ker13 06.12.2008 01:05

вопрос)
 
как с точки зрения скорости и правильности написать скрипт работа которого заключается вот в чем: есть файл, содержание допустим:
11 22 йц@ук 44
66 77 фы@ва 55
88 99 яч@см 00
44 55 йц@ук 22
нада убрать дубли строк в которых повторяются 3 столбик, т.е. где мыла.
как я придумал: сначала с помощью регулярки создаем массив всех мыл. потом удаляем дубли с помощью функции array_unique. потом цикл для каждой строки в файле, так же с помощью регулярки вытаскиваем мыло и еще запускаем цикл для каждого елемента в массиве мыл. и если они равны то сохраняем строчку и выходим из первого цикла. какие будут предложения?)

spider-intruder 06.12.2008 01:12

Поставить это в БД и не парится

Ищи прогу SQLYog

В ней удобный импорт из любого структурированного файла.
Потом кури distinct
И ВСе! :-)

Neoveneficus 06.12.2008 01:15

Используй bash скрипты под Linux.
Мне кажется это самое простое.
Тебе нужны команды sort и uniq.
Первая сортирует, вторая удаляет дубли.
Так вот, во второй можно указать, какую часть строки исследовать. (Нужно почитать мануал grep и написать регулярку).
Пишется с манами 30 минут.
P.S. Если не разберешься - завтра могу помочь. Го ПМ. Сейчас мегаустал и сплю...

j0ker13 06.12.2008 01:23

))чет в инете видел что array_unique сохраняет индексы. каким образом замутить?)

sql не совсем подходит) нужны прога для частого использования))

m0nsieur 06.12.2008 02:15

Раз тебе не понравился совет spider-intruder

Тогда можно несколько переделать твой алгоритм:
1. Как ты и сказал дернуть все мыла регуляркой и сохранить в 2 массива
2. 1 массив будет исходный, а по 2-ому пройтись через array_unique, затем вычислить между ними разницу, цель - найти все повторяющиеся значения.
3. Делаем проход с удалением повторяющихся значений по файлу - это будет оптимальней, полагая, что уникальных записей будет больше чем повторяющихся, следовательно проходов в цикле будет меньше.

P.S. Вариант с БД ловчее ;)

FeoЩту 06.12.2008 02:18

$file = file('file.txt');
$arr = array();
for($i=0;$i<count($file);$i++) {
$file[$i] = explode(' ', $file[$i]);
if(in_array($file[$i][2], $arr)) {
unset($file[$i]);
} else {
$arr[] = $file[$i][2];
}
}

j0ker13 06.12.2008 13:49

2FeoЩту в твоем скрипте если я не ошибаюсь дубли вместе с оригиналами удалятся) а их нада оставить)
$arr Это походу массив мыл?)


вот что получилось))
<?php
$file_ar=file('c:\1.txt');
foreach($file_ar as $r){
preg_match("/([[:alnum:]]|[[:punct:]]){1,}@(.*)\.[[:alnum:]]{2,3}/",$r,$o);
$email_ar[]= $o[0];
}
$email_ar=array_unique($email_ar);
$arr = array();
for($i=0;$i<count($file_ar);$i++) {
preg_match("/([[:alnum:]]|[[:punct:]]){1,}@(.*)\.[[:alnum:]]{2,3}/",$file_ar[$i],$o);
$email1= $o[0];
if((in_array($email1,$email_ar)) and (!in_array($email1,$arr))) {
$arr[]=$email1;
echo $file_ar[$i].'<br>';
}}
?>


Время: 12:32