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

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

Veles

Постоялец
Регистрация
14 Мар 2007
Сообщения
265
Реакции
151
Вобщем как в РНР сделать, чтобы из файла выбиралось N случайных строк? Не загоняя весь файл в массив. Так как файл от 500 метров. Сенкс.
 
Один из вариантов решения:
1. Перемещаешь файловый указатель с помощью fseek, скажем на 4096 байт;
2. Считываешь файл посимвольно пока не найдешь конец строки;
3. Считываешь посимвольно строку от начала до конца;
4. Повторяешь пункты 1-3 сколько нужно раз
 
Вариант два - делать не через пхп, а это "не" вызывать через командную строку через пхп..
Работать будет в разы быстрее.
 
еще можно использовать вызов внешних программ из php с помощью system или exec и вызывать AWK, SEL, GREP из *nix-подобных систем, причем на AWK более функционален, чем остальные
 
1)Генеришь рандомные номера строк.
Код:
rand(min, max)
2)В цикле вызываешь fgets, если номер текущей строки == одному из сгенерённых номеров - сохраняешь строку куданить.
 
1)Генеришь рандомные номера строк.
Код:
rand(min, max)
2)В цикле вызываешь fgets, если номер текущей строки == одному из сгенерённых номеров - сохраняешь строку куданить.

Это получается для получения 500-й строки, нужно будет прочитать 499 строк :D, или как ты будешь определять что что пошла n-ная строка? - это все равно что считать файл целиком
 
О боже программисты тут понасобрались, уж если не знаете не советуйте что ли... :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 минуты
Вариант два - делать не через пхп, а это "не" вызывать через командную строку через пхп..
Работать будет в разы быстрее.
Вот с этим согласен, если не делать вывод работы скрипта на экран, а делать вывод результата в файл, то будет в разы быстрее, так будет только интерпретатор выполнять скрипт, а если с выводом, то будет ещё и апач напрягаться.
 
О боже программисты тут понасобрались, уж если не знаете не советуйте что ли... :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 минуты

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


Ты сам головой бы подумал, как 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);
?>
 
Вариант два - делать не через пхп, а это "не" вызывать через командную строку через пхп..
Работать будет в разы быстрее.

Ты сам головой бы подумал, как 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);
?>
Твой рабочий скрипт, извеняюсь я что-то не глянул что там размер 500метров, а вообще зависит от сервака и его ресурсов.
 
Всем спасибо, отдельное спасибо первому ответившиму, так как у него самый оптимальный вариант, у других сильно замучено что-то....

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

PHP:
$randstr = rand (1, filesize($keywd));
fseek ($keywd, $randstr);
$str = fgets ($keywd);
$str = fgets ($keywd);
echo ("<br>$str");
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху