поиск в большом файле

Тема в разделе "PHP", создана пользователем vtreertyu, 5 фев 2011.

Модераторы: latteo
  1. vtreertyu

    vtreertyu Писатель

    Регистр.:
    24 янв 2011
    Сообщения:
    7
    Симпатии:
    0
    Есть текстовый файл 5.25 ГБ, в нем миллионы строк. Нужно средствами php найти все строки, которые содержат введенное мной слово и сохранить в отдельный файл найденный список строк. Пробовал просто читать, но выдает, что слишком большой файл
     
  2. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Надо открывать файл и читать блоками

    Вот пример
    PHP:
    <?php
    $handle 
    fopen("file.txt""rb");
    while (!
    feof($handle)) {
    //читаем блок
      
    $contentfread($handle8192);
    //обрабатываем его как хотим
    }
    fclose($handle);
     
    vtreertyu нравится это.
  3. vtreertyu

    vtreertyu Писатель

    Регистр.:
    24 янв 2011
    Сообщения:
    7
    Симпатии:
    0
    благодарю, а что надо еще дописать в этот код, чтобы найти и сохранить в отдельный список все строки содержащие "искомое слово"
     
  4. djinn11

    djinn11 Прохожие

    Надо поделить файл на много частей путем выпезания строк...
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    _www.php.ru/manual/function.stripos.html
    стандартный пример вполне поможет понять как модифицировать код.

    Добавлено через 3 минуты
    В коде не учтены переходы строк, стоит использовать функцию fgets либо, читая посимвольно(fgetc) в буфер, искать символы окончания строк.
     
  6. AleksWhite

    AleksWhite Постоялец

    Регистр.:
    5 фев 2008
    Сообщения:
    55
    Симпатии:
    10
    Проще в блоке найти последний символ окончания строки.
    Например так
    PHP:
    $strings explode("\n",$content);
    ну а дальше работаем как с массивом.
    Можно разбивать не по символу конца строки, а по символм окончания предложений (точка, !, ?,...).
    Вариантов множество.

    PS интересно где автор умудрился собрать такой огромный текстовый файл????!!!!
     
  7. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    Согласен с тем, что такой вариант существует. Но использовать его проблематично: в прочитанных байтах может быть несколько переносов строк - нужно делать цикл и проверять count() массива или не быть ни одного - придется делать объединения строк. Это усложнит код и внесет кучку дополнительных операций, которых можно было избежать.
    В общем кучка не нужной работы...

    Идея более здравая, но противоречит ТЗ.

    Работаю сейчас с дампами, из которых списки доменов можно получить, 2GB текстовик вполне нормальный размер :)
     
  8. Stinger757

    Stinger757 Создатель

    Регистр.:
    6 ноя 2008
    Сообщения:
    28
    Симпатии:
    5
    Так конечно можно, но не с 5 ГБ файлом
    Ну и автор указал что там построчно, тогда просто можно открыть
    $content=file("file.txt"); Опять таки фаил слишокм большой.
    Вариант Liver c небольшой поправкой
    PHP:
    $search_word="hello";
    $handle fopen("file.txt""rb");
    while (!
    feof($handle)) {
    //читаем блок
      
    $contentfgets($handle);
        if (
    strrpos($content,$search_word))
            {
                    
    $fp=fopen("result.txt","a+");
                    
    fwrite($fp,"$content");
            }
    }
    fclose($fp);
    fclose($handle);