Работа с файлами, вопрос

Тема в разделе "PHP", создана пользователем Veles, 6 авг 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Veles

    Veles

    Регистр.:
    14 мар 2007
    Сообщения:
    219
    Симпатии:
    106
    Вобщем как в РНР сделать, чтобы из файла выбиралось N случайных строк? Не загоняя весь файл в массив. Так как файл от 500 метров. Сенкс.
     
  2. pslava

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
    Один из вариантов решения:
    1. Перемещаешь файловый указатель с помощью fseek, скажем на 4096 байт;
    2. Считываешь файл посимвольно пока не найдешь конец строки;
    3. Считываешь посимвольно строку от начала до конца;
    4. Повторяешь пункты 1-3 сколько нужно раз
     
    Veles нравится это.
  3. B1rdEX

    B1rdEX Постоялец

    Регистр.:
    30 июн 2008
    Сообщения:
    141
    Симпатии:
    26
    Вариант два - делать не через пхп, а это "не" вызывать через командную строку через пхп..
    Работать будет в разы быстрее.
     
  4. pslava

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
    еще можно использовать вызов внешних программ из php с помощью system или exec и вызывать AWK, SEL, GREP из *nix-подобных систем, причем на AWK более функционален, чем остальные
     
  5. akgrad

    akgrad

    Регистр.:
    26 июл 2008
    Сообщения:
    161
    Симпатии:
    29
    1)Генеришь рандомные номера строк.
    Код:
    rand(min, max)
    2)В цикле вызываешь fgets, если номер текущей строки == одному из сгенерённых номеров - сохраняешь строку куданить.
     
  6. pslava

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
    Это получается для получения 500-й строки, нужно будет прочитать 499 строк :D, или как ты будешь определять что что пошла n-ная строка? - это все равно что считать файл целиком
     
  7. Lonely Wolf

    Lonely Wolf Прохожие

    О боже программисты тут понасобрались, уж если не знаете не советуйте что ли... :D

    Код:
    <?php
    $countstr = 5; # Кол-во строк какое нужно
    $file = file('file.txt'); # Файл который парсить
    for($i=0;$i<$countstr;$i++){
      $randstr[$i] = $file[rand(0,count($file))];
    }
    echo "<pre>";
    print_r($randstr);
    echo "</pre>";
    ?>
    
    Это пример в котором в переменную $randstr будет массив строк случано выбраных из файла.


    Код:
    <?php
    $countstr = 5; # Кол-во строк какое нужно
    $file = file('file.txt'); # Файл который парсить
    for($i=0;$i<$countstr;$i++){
      $randstr .= $file[rand(0,count($file))]."<br>\n";
    }
    echo $randstr;
    ?>
    
    Это пример в котором в переменную $randstr будет сложены все строки в одну и разделена переносами.

    Добавлено через 2 минуты
    Вот с этим согласен, если не делать вывод работы скрипта на экран, а делать вывод результата в файл, то будет в разы быстрее, так будет только интерпретатор выполнять скрипт, а если с выводом, то будет ещё и апач напрягаться.
     
  8. cyberquoter

    cyberquoter Создатель

    Регистр.:
    26 июн 2008
    Сообщения:
    22
    Симпатии:
    6

    Ты сам головой бы подумал, как 500 метров будешь в массив загонять? Ыыы.

    ТС: сейчас накидаю тебе нужное скрипто -выложу :)

    Добавлено через 22 минуты
    Вот результат, вообщем. Пясал недолго - за качество не пинать. Ну и доработать, может, где нада )

    PHP:
    <?php
        
        $file 
    'test.txt';
        
    $stringsCount 5;
        
        
    // Первый этап: подсчет количества строк
        
    $counter 0;        
        
    $fr fopen($file'r');
        
        while ((
    $line fgets($fr)) !== false) {
            if(
    strlen($line) > 0) {
                
    $counter++;
            }
        }
        
        
    fclose($fr);
        unset(
    $line);
        
        
    // Этап второй: заполняем номера строк, которые нам нужны
        
    $numbers = array();
        
        while (
    $stringsCount) {
            
    $tempNum rand(1$counter);
            
            if(
    in_array($tempNum$numbers)) {
                continue ; 
            } else {
                
    $numbers[] = $tempNum;
                
    $stringsCount--;
            }
        }
        
        unset(
    $stringsCount$tempNum$counter);
        
        
    // Этап третий: непосредственное чтение файла и выбор нужных строк
        
    $fr fopen($file'r');
        
        
    $pointer 1;
        
    $strings = array();
        
        while ((
    $line fgets($fr)) !== false) {
            
            if(
    in_array($pointer$numbers)) {
                
    $strings[] = $line;
            } 
            
            
    $pointer++;
        }
        
    fclose($fr);
        
    print_r($strings);
    ?>
     
  9. Lonely Wolf

    Lonely Wolf Прохожие

    Твой рабочий скрипт, извеняюсь я что-то не глянул что там размер 500метров, а вообще зависит от сервака и его ресурсов.
     
  10. Veles

    Veles

    Регистр.:
    14 мар 2007
    Сообщения:
    219
    Симпатии:
    106
    Всем спасибо, отдельное спасибо первому ответившиму, так как у него самый оптимальный вариант, у других сильно замучено что-то....

    вот решение, вызывать в цикле до N

    PHP:
    $randstr rand (1filesize($keywd));
    fseek ($keywd$randstr);
    $str fgets ($keywd);
    $str fgets ($keywd);
    echo (
    "<br>$str");
     
Статус темы:
Закрыта.