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

Тема в разделе "PHP программирование", создана пользователем rubik-nerubik, 4 май 2007.

Статус темы:
Закрыта.
  1. rubik-nerubik

    rubik-nerubik Гость

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

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


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

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

    MajestiC Гость

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

    Код (Text):
    $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';
     
  3. rubik-nerubik

    rubik-nerubik Гость

    огромное спасибо)
     
  4. aka_Kail

    aka_Kail Гость

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

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

    MajestiC Гость

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

    aka_Kail Гость

    Не помню где, но нарывался на инфу, что 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 метра.
    Только разборка такого файла - тоже довольно редкая задача.

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

Поделиться этой страницей