База данных - текстовый файл

Тема в разделе "PHP", создана пользователем molp, 25 янв 2009.

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

    molp Создатель

    Регистр.:
    23 янв 2008
    Сообщения:
    27
    Симпатии:
    2
    Помогите с кодом пожалуйста
    Необходимо рандомный вывод строк из txt файла
     
  2. General Fizz

    General Fizz Боевой Генерал :)

    Регистр.:
    11 апр 2007
    Сообщения:
    753
    Симпатии:
    396
    В поиск, уже была похожая тема.

    Текстовые базы для случайной выборки - зло, используй Berkeley DB4.
     
  3. midw0rk

    midw0rk Создатель

    Регистр.:
    1 окт 2008
    Сообщения:
    33
    Симпатии:
    7
    Как вариант, конечно очень расточительный если играть с большими файлами.


    PHP:
    <?
        
    $filename "test.txt";

        
    $fp fopen$filename'r' );

        
    $total_lines=0;

        while( !
    feof$fp ) )
        {
              
    $line fgets$fp4096 );
            if( !
    feof$fp ) ) $total_lines++;
        }

        
    $random_line rand1$total_lines );

        
    rewind$fp );

        while( 
    $random_line )
        {
              
    $line fgets$fp4096 );
              
    $random_line--;
        }

        echo 
    $line;
    ?>

     
  4. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Как вариант, если уж очень надо именно текстовый файл, сделай подобие индекса. То есть заведи еще один файл где через равное смещение пишутся данные строка-смещение-длина(необязательно) в основном файле.

    Тогда выборка будет такая
    1.генерим нужное число рэндомной строки.
    2. Выбираем из файла индекса данные о строке по алгоритму номер*фикс. смещение
    3. выбираем саму строку из основного файла данных.

    Получишь нормальную скорость даже на больших файлах, но за счет лишнего места. Плюс проблемы с редактированием, после которого потери места вырастут.

    зы: имхо это изврат. но иногда надо. сам подобное леплю.
     
  5. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Это до ненельзя разжованно
    Код:
    <?PHP
    $file=file("путь_до_файла/имя_файла"); // Масив файла. В каждом ключе по строке.
    $count=count($file); // Узнаем сколько ключей в масиве (=колличеству строк в файле +1 строка)
    $count=$count-1; // Отнимаем ту самую лишнюю строку.
    $rand=rand(0,$count); // Генерируем случайное число от "0" до колличества ключей в масиве (строк в файле).
    
    echo $file[$rand]; // Выводим данные из масива $file со случайным ключем $rand. Ну или если попроще то выводим случайную строку из файла
    ?>

    Ну а это тоже самое только по нормальному ))
    Код:
    <?PHP
    $file=file("путь_до_файла/имя_файла"); // Масив файла. В каждом ключе по строке.
    echo $file[rand(0,count($file)-1)];
    ?>
    Про кнопочку спасибо не забываем:ah:

    Добавлено через 3 минуты
    :D:ay: Причем полный. Я согласен когда файло весит метров 300-~ но до меньшего размера это полный изврат.
     
  6. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    2Inviseble_Demon
    file(), на сколько я знаю, не берет файлы > 500Мб
     
  7. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Inviseble_Demon,
    1. прочитай правила относительно выпрашивания "Спасибо"
    2. Твой вариант тоже полный изврат поскольку размер файла не известен, и если он больше 20 метров тебя попрут с большинства хостингов.
     
  8. Jacob

    Jacob

    Регистр.:
    18 окт 2006
    Сообщения:
    257
    Симпатии:
    18
    у кнута в каком-то из томов есть крутой алгоритм для рандомного выбора с равной вероятностью при неизвестном количестве элементов, где не надо целиком считывать файл.
     
  9. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    У меня размер 4 гига. Читать все file() просто нереально

    Ну если долго не думать, то наверно он такой - имеем максимальную длину строки, прыгнули в любое место файла и отмеряли в обе стороны, отсекли по переносам строк и имеем рэндомную строку.
     
  10. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Со всеми своими ошибкоми вышет полностью согласен и раскаиваюсь !


    Думаю автору темы порабы внести ясность-ему нужно с биг файла вынести строку или с мелкого !?

    Просто с файлами работать ой какой гемор на мускуле бы и вопросов не возникло ))
     
Статус темы:
Закрыта.