представьте замену в виде строки в большом файле с php

Я пытаюсь сделать строковую замену для всего файла в PHP. Мой файл составляет более чем 100 МБ, таким образом, я должен пойти линию за линией и не могу использовать file_get_contents(). Существует ли хорошее решение этого?

9
задан Alix Axel 29 January 2010 в 03:38
поделиться

4 ответа

Если вам не требуется использовать 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");
12
ответ дан 4 December 2019 в 07:35
поделиться

В дополнение к тому, что написал Ник Крейвер, вы хотели бы использовать транзакцию, когда у вас есть серия записей, которые должны быть выполнены атомарно; то есть все они должны преуспеть или ни один не должен преуспеть.

-121--1422442-

Возможно, необходимо принудительно ввести флаг hasLayout элемента. Это можно сделать, применив к нему свойство CSS zoom: 1 .

-121--2241606-

Получить несколько строк за раз, выгрузить переменную, получить следующие несколько строк.

$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.

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

2
ответ дан 4 December 2019 в 07:35
поделиться

Вот так:

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');
7
ответ дан 4 December 2019 в 07:35
поделиться

что-то вроде этого?

$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);
2
ответ дан 4 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: