вопрос)

Discussion in 'PHP' started by j0ker13, 6 Dec 2008.

  1. j0ker13

    j0ker13 Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    199
    Likes Received:
    16
    Reputations:
    5
    как с точки зрения скорости и правильности написать скрипт работа которого заключается вот в чем: есть файл, содержание допустим:
    11 22 йц@ук 44
    66 77 фы@ва 55
    88 99 яч@см 00
    44 55 йц@ук 22
    нада убрать дубли строк в которых повторяются 3 столбик, т.е. где мыла.
    как я придумал: сначала с помощью регулярки создаем массив всех мыл. потом удаляем дубли с помощью функции array_unique. потом цикл для каждой строки в файле, так же с помощью регулярки вытаскиваем мыло и еще запускаем цикл для каждого елемента в массиве мыл. и если они равны то сохраняем строчку и выходим из первого цикла. какие будут предложения?)
     
  2. spider-intruder

    spider-intruder Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    700
    Likes Received:
    339
    Reputations:
    37
    Поставить это в БД и не парится

    Ищи прогу SQLYog

    В ней удобный импорт из любого структурированного файла.
    Потом кури distinct
    И ВСе! :)
     
    #2 spider-intruder, 6 Dec 2008
    Last edited: 6 Dec 2008
  3. Neoveneficus

    Neoveneficus Elder - Старейшина

    Joined:
    10 Apr 2008
    Messages:
    235
    Likes Received:
    126
    Reputations:
    23
    Используй bash скрипты под Linux.
    Мне кажется это самое простое.
    Тебе нужны команды sort и uniq.
    Первая сортирует, вторая удаляет дубли.
    Так вот, во второй можно указать, какую часть строки исследовать. (Нужно почитать мануал grep и написать регулярку).
    Пишется с манами 30 минут.
    P.S. Если не разберешься - завтра могу помочь. Го ПМ. Сейчас мегаустал и сплю...
     
  4. j0ker13

    j0ker13 Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    199
    Likes Received:
    16
    Reputations:
    5
    ))чет в инете видел что array_unique сохраняет индексы. каким образом замутить?)

    sql не совсем подходит) нужны прога для частого использования))
     
    #4 j0ker13, 6 Dec 2008
    Last edited: 6 Dec 2008
  5. m0nsieur

    m0nsieur Elder - Старейшина

    Joined:
    8 Apr 2008
    Messages:
    223
    Likes Received:
    69
    Reputations:
    10
    Раз тебе не понравился совет spider-intruder

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

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

    FeoЩту New Member

    Joined:
    13 Nov 2008
    Messages:
    29
    Likes Received:
    4
    Reputations:
    0
    $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];
    }
    }
     
  7. j0ker13

    j0ker13 Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    199
    Likes Received:
    16
    Reputations:
    5
    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>';
    }}
    ?>
     
    #7 j0ker13, 6 Dec 2008
    Last edited: 6 Dec 2008