Найти номер строки!

  • Автор темы rubik-nerubik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

rubik-nerubik

#1
Вот очень нужен скрипт, который выдал номер строки, в которой стоит слово...
например:

файл с следующим содержанием:
textnenuasdasddfsadf
dfasdfsdfsdfsdfsdf
ffffffffffffffffffSLOVOfffffffffrrrrr
32423423423423423423423423423
r34r34r34r34r34r34r34r34r


И нужно найти номер строки, в которой стоит слово 'SLOVO'..., приблизительно так...

если что rubik-nerubik@maill.ru
я ваще заипся уже
 
M

MajestiC

#2
Самый простой вариант перебор всех строк и поиск в них слова =)

Код:
$hFile = fopen('1.1', 'r');
$iCnt  = 0;
$bFound = false;
while (!feof($hFile)) 
{
$iCnt++;
if (strpos(fgets($hFile, 4096), 'SLOVO') !== false)
{
$bFound = true;
break;
}
}
fclose($hFile);

if ($bFound)
echo 'String found at '.$iCnt.' line';
else
echo 'Sorry, nothing found';
 
A

aka_Kail

#4
Можно сделать красивее...

# Считаем файл в массив
$file = file("File.txt");
# Прокрутим массив
foreach ($file as $key => $val) {
#если найдено слово "SLOVO" в строке
if (strpos($val,"SLOVO")!==FALSE) { $num_stroki = $key; break; }
}
# Но учтите, массивы начинаются с 0!! поэтому если считать с первой строки,
# надо припюсовать к найденому значению еденицу
$num_stroki+=1; // Теперь тут номер стоки со словом "SLOVO"
 
M

MajestiC

#5
Для: aka_Kail
Это нихрена не красиво, из-за того что весь файл считывается в массив.
Если это 5кб, то пофиг, а если 300 Mb?
 
A

aka_Kail

#6
Не помню где, но нарывался на инфу, что file работает намного быстрее чем fopen.
и я думаю, что будет быстрее считать один раз весь файл, чем "кусать" его кусочками.

Вот с сохранённой странички.

Для чтения файла file() быстрее, чем fopen+цикл - ускорение 40%
Чтобы прочитать в массив $x файл размером 1Мб (100 000 строк по 10 байт) можно воспользоваться двумя вариантами: чтение файла с помощью file(), либо традиционным методом fopen/fgets. Разумеется, для файлов разного объема и содержимого скорость может меняться. Но в данном примере статистика такова: file("1Mb_file.txt") работает на 40% быстрее, чем:
$f=fopen("1Mb_file.txt","r") or die(1);
while($x[]=fgets($f,1000));
fclose($f);
Тот же тест, но на 15Мб файле (100 000 строк по 150 байт) показывает разницу в 50%, в пользу file().
(Для поиска всей, кстати, довольно полезной, статьи скормите часть текста гуглю)
Кроме того, эта Волшебная функция ( file() ) позволяет получать файлы с удалённых серверов, даже если на хостинге запрещено использовать удалённые файлы. :blink:

Ну а за 300 мб файл.. Да, вы тут правы!
ни один хостер не даст вам под скрипт столько памяти... И если по тайм-лимиту не вылетим
В среднем дают 32 метра.
Только разборка такого файла - тоже довольно редкая задача.

Итог - Применение более быстрого или умеющего работать с большими файлами метода - индивидуально для конкретной необходимости.
 
Статус
Закрыто для дальнейших ответов.