Я пытаюсь сделать строковую замену для всего файла в PHP. Мой файл составляет более чем 100 МБ, таким образом, я должен пойти линию за линией и не могу использовать file_get_contents()
. Существует ли хорошее решение этого?
Если вам не требуется использовать PHP, я настоятельно рекомендую выполнять подобные действия из командной строки. . Это лучший инструмент для работы, и его гораздо проще использовать.
В любом случае, команда sed
(Stream Editor) - это то, что вам нужно:
sed s/search/replace oldfilename > newfilename
Если вам нужна нечувствительность к регистру:
sed -i s/search/replace oldfilename > newfilename
Если вам нужно, чтобы это выполнялось динамически в PHP вы можете использовать passthru ()
:
$output = passthru("sed s/$search/$replace $oldfilename > $newfilename");
В дополнение к тому, что написал Ник Крейвер, вы хотели бы использовать транзакцию, когда у вас есть серия записей, которые должны быть выполнены атомарно; то есть все они должны преуспеть или ни один не должен преуспеть.
-121--1422442- Возможно, необходимо принудительно ввести флаг hasLayout элемента.
Это можно сделать, применив к нему свойство CSS zoom: 1
.
Получить несколько строк за раз, выгрузить переменную, получить следующие несколько строк.
$fh = fopen("bigfile.txt", "flags");
$num = 0;
$length = 300;
$filesize = filesize("bigfile.txt");
while($num < $filesize)
{
$contents = fread($fh, $length);
// .. do stuff ...
$num = $num+$length;
fseek($fh, $num);
}
fclose($fh);
Вы хотите убедиться, что это правильно (не протестировано). См. библиотеку в документе Документация PHP.
Сложная часть будет записана обратно в файл. Первая идея, которая приходит мне в голову, это заменить последовательность, записать новое содержимое в другой файл, а затем в конце удалить старый файл и заменить его новым.
Вот так:
function replace_file($path, $string, $replace)
{
set_time_limit(0);
if (is_file($path) === true)
{
$file = fopen($path, 'r');
$temp = tempnam('./', 'tmp');
if (is_resource($file) === true)
{
while (feof($file) === false)
{
file_put_contents($temp, str_replace($string, $replace, fgets($file)), FILE_APPEND);
}
fclose($file);
}
unlink($path);
}
return rename($temp, $path);
}
Назовите так:
replace_file('/path/to/fruits.txt', 'apples', 'oranges');
что-то вроде этого?
$infile="file";
$outfile="temp";
$f = fopen($infile,"r");
$o = fopen($outfile,"a");
$pattern="pattern";
$replace="replace";
if($f){
while( !feof($f) ){
$line = fgets($f,4096);
if ( strpos($pattern,"$line") !==FALSE ){
$line=str_replace($pattern,$replace,$line);
}
fwrite($o,$line);
}
}
fclose($f);
fclose($o);
rename($outfile,$infile);