Перезаписать строку в файле с помощью PHP

17

Каков наилучший способ перезаписи определенной строки в файле? Я в основном хочу искать файл для строки «@parsethis» и перезаписывать остальную часть этой строки чем-то другим.

    
задан Wilco 25.10.2008 в 01:34
источник

5 ответов

18

Если файл не слишком большой, лучшим способом, вероятно, будет чтение файла в массив строк с file () , просмотрите массив строк для вашей строки и отредактируйте эту строку, затем implode () массив назад и fwrite () обратно в файл.

    
ответ дан Jeremy Ruten 25.10.2008 в 01:38
источник
  • Это, как я всегда это делал. Мне будет интересно узнать, есть ли способ изменить файлы на месте. –  Mark Biek 25.10.2008 в 01:42
  • Если вы используете файл () для входа, то после implode вы, вероятно, захотите file_put_contents () сделать это в одной строке. –  Frank Nocke 06.12.2011 в 19:46
20

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

$source='in.txt';
$target='out.txt';

// copy operation
$sh=fopen($source, 'r');
$th=fopen($target, 'w');
while (!feof($sh)) {
    $line=fgets($sh);
    if (strpos($line, '@parsethis')!==false) {
        $line='new line to be inserted' . PHP_EOL;
    }
    fwrite($th, $line);
}

fclose($sh);
fclose($th);

// delete old source file
unlink($source);
// rename target file to source file
rename($target, $source);
    
ответ дан Stefan Gehrig 25.10.2008 в 10:08
источник
5

Основная проблема заключается в том, что новая строка может быть не такой же длины, как у старой строки. Если вам нужно изменить длину строки, нет пути перезаписи, по крайней мере, всего файла после измененной строки. Самый простой способ - создать новый, измененный файл, а затем переместить его поверх оригинала. Таким образом, для читателей всегда доступен полный файл. Используйте блокировку, чтобы убедиться, что один скрипт одновременно модифицирует файл, и поскольку вы собираетесь заменить файл, выполните блокировку в другом файле. Проверьте flock() .

Если вы уверены, что новая строка будет такой же длины, как и в старой строке, вы можете открыть файл в режиме чтения / записи (используйте r+ в качестве второго аргумента для fopen() ) и вызовите ftell() для сохранения позиции, начинающейся с каждой строки, прежде чем вы вызовете fgets() , чтобы прочитать строку. Когда вы найдете строку, которую хотите переписать, вы можете использовать fseek() , чтобы вернуться к началу строки и fwrite() новых данных. Один из способов заставить линию всегда иметь одинаковую длину, - это простое место для максимальной длины.

    
ответ дан Glomek 25.10.2008 в 02:13
источник
0

или если ваш файл не слишком большой:

$sample = file_get_contents('sample');
$parsed =preg_replace('#@parsethis.*#', 'REPLACE TO END OF LINE', $sample);

Вам нужно будет выбрать разделители '#', которые не присутствуют в файле.

    
ответ дан Ken 25.10.2008 в 10:44
источник
-1

Я бы скорее всего сделал то, что предложил Джереми, но просто для альтернативного способа сделать это здесь - другое решение. Это не было протестировано или использовано и предназначено для систем * nix.

$cmd = "grep '@parsethis' " . $filename;
$output = system($cmd, $result);
$lines = explode("\n", $result);
// Read the entire file as a string
// Do a str_repalce for each item in $lines with ""
    
ответ дан Gaurav 25.10.2008 в 02:05
источник