PHP способ получить количество строк в файле и переместить указатель файла на указанную строку? [закрыто]


Есть ли способ:

  1. подсчитайте количество строк (1 строка = строка данных) в моем small_db.php
  2. скажите PHP переместить указатель файла точно в начало строки 322. (чтобы я мог fgets() данные из этой строки)
  3. скажите PHP, чтобы он вернул номер строки или все содержимое строки, в которой встречается текст "Быстрая коричневая лиса"?

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

Author: nickb, 2012-06-23

1 answers

Для начала приведем некоторые основные переменные:

$filename = 'small_db.php';
$linenum  = 322;
$needle = 'Quick brown fox';
  1. Как я могу посчитать количество строк в файле?

    Чтобы сделать это быстро и легко, используйте count() после того, как вы откроете файл с file():

    $count = count( file( $filename));
    

    Однако для этого потребуется много памяти , если ваш файл большой, так как он должен загрузить весь файл в память, чтобы посчитать возвращаемое значение из file(). В качестве альтернативы вы можете использовать стандартный функции файлов, fopen(), feof(), fgets(), и fclose(), чтобы открыть файл и прочитать его строчку за строчкой, ведя счет по ходу, вот так:

    $count = 0;
    $fp = fopen( $filename, 'r');
    
    while( !feof( $fp)) {
        fgets( $fp);
        $count++;
    }
    
    fclose( $fp);
    
  2. Как я могу переместить указатель файла в начало определенного номера строки?

    Это лучше всего достигается с помощью SplFileObject класс. Вы создаете новый объект этого класса с именем файла, который вы открываете, затем используете seek() стремиться к номер строки по вашему выбору. Затем вы можете использовать key() чтобы показать номер строки и current() ( или getCurrentLine() или fgets()) чтобы получить содержимое этой строки, вот так:

    // Create a new object for the file
    $file = new SplFileObject( $filename);
    
    // Seek to to the specific line number
    $file->seek( $linenum);  
    
    // Print that line:
    echo 'Line #' . $file->key() . ' contains: ' . $file->current();
    
  3. Как я могу вернуть номер строки или все содержимое строки, в которой встречается определенная игла?

    Насколько я знаю, нет встроенных функций/методов PHP, которые могли бы это сделать. Вам нужно будет разобрать его самостоятельно с помощью чего-нибудь аналогично этой функции, которая проверяет каждую строку в файле, заданную указателем на файл $fp, на соответствие определенному регистру $needle с использованием strpos() ( вы можете использовать stripos() для поиска без учета регистра):

    function find_in_file( $fp, $needle) {
        rewind( $fp); // Or: fseek($fp, 0);
    
        $line_number = 0;
    
        while( !feof( $fp)) {
            $line = fgets( $fp);
            if( !( strpos( $line, $needle) === false)) {
                break;
            }
            $line_number++;
        }
    
        return feof( $fp) ? null : array( 
            'line_number' => $line_number,
            'line' => fgets( $fp)
        );
    }
    

    Вам нужно было бы вызвать эту функцию следующим образом:

    $fp = fopen( $filename, 'r');
    $return = find_in_file( $fp, $needle);
    if( !is_null( $return)) {
        echo 'Found ' . $needle . ' in line #' . $return['line_number'] . "\n";
        echo 'That line contains: ' . $return['line'];
    }
    fclose( $fp);
    
 13
Author: nickb, 2017-09-02 09:12:02