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

Статус
В этой теме нельзя размещать новые ответы.

molp

Создатель
Регистрация
23 Янв 2008
Сообщения
31
Реакции
2
Помогите с кодом пожалуйста
Необходимо рандомный вывод строк из txt файла
 
В поиск, уже была похожая тема.

Текстовые базы для случайной выборки - зло, используй Berkeley DB4.
 
Как вариант, конечно очень расточительный если играть с большими файлами.


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

	$fp = fopen( $filename, 'r' );

	$total_lines=0;

	while( !feof( $fp ) )
	{
  		$line = fgets( $fp, 4096 );
		if( !feof( $fp ) ) $total_lines++;
	}

	$random_line = rand( 1, $total_lines );

	rewind( $fp );

	while( $random_line )
	{
  		$line = fgets( $fp, 4096 );
 	 	$random_line--;
	}

	echo $line;
?>
 
Как вариант, если уж очень надо именно текстовый файл, сделай подобие индекса. То есть заведи еще один файл где через равное смещение пишутся данные строка-смещение-длина(необязательно) в основном файле.

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

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

зы: имхо это изврат. но иногда надо. сам подобное леплю.
 
Помогите с кодом пожалуйста
Необходимо рандомный вывод строк из txt файла

Это до ненельзя разжованно
Код:
<?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)];
?>



Добавлено через 3 минуты
Как вариант, если уж очень надо именно текстовый файл, сделай подобие индекса. То есть заведи еще один файл где через равное смещение пишутся данные строка-смещение-длина(необязательно) в основном файле.

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

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

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

:D:ay: Причем полный. Я согласен когда файло весит метров 300-~ но до меньшего размера это полный изврат.
 
2Inviseble_Demon
file(), на сколько я знаю, не берет файлы > 500Мб
 
Inviseble_Demon,
1. прочитай правила относительно выпрашивания "Спасибо"
2. Твой вариант тоже полный изврат поскольку размер файла не известен, и если он больше 20 метров тебя попрут с большинства хостингов.
 
у кнута в каком-то из томов есть крутой алгоритм для рандомного выбора с равной вероятностью при неизвестном количестве элементов, где не надо целиком считывать файл.
 
:D:ay: Причем полный. Я согласен когда файло весит метров 300-~ но до меньшего размера это полный изврат.

У меня размер 4 гига. Читать все file() просто нереально

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

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


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

Просто с файлами работать ой какой гемор на мускуле бы и вопросов не возникло ))
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху