Самый быстрый способ поиска и удаления / добавления строки из / в файл

Мне интересно, какой самый быстрый способ - это удалить конкретную строку из потенциально большого файла, если он существует.

Так, например, я хочу следующую строку

abc

быть удаленным из файла

yxz
srtabc
abc
efg

становление

yxz
srtabc
efg

Также я хочу добавить строку в файл, если он еще не существует.

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

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

2 ответа

Для производительности не используйте php.

Но если вы настаиваете, и если вам нужна только одна операция замены, прочитайте весь файл, затем замените строку (как строку) и запишите ее обратно. Т.е. не разбивайте файл на отдельные строки, так как все будет медленнее, чем необходимо.

Это должно к подвоху:

$input = file_get_contents($filename_in);

$find = "abc..";

$find_q = preg_quote($find,'/');
$output = preg_replace("/^$find_q(\n|\$)/m","",$input);

file_put_contents($filename_out,$output);

Удаляет строки, содержащие точно $findвключая завершающий перевод строки. Если последняя строка не \n прекращено, оно все равно будет удалено.

Чтобы проверить, есть ли строка, используйте аналогичный подход:

$find_q = preg_quote($find,'/');
if ( !preg_match("/^$find_q(\n|\$)/m",$input) )
{
    $input .= $find."\n"; // note: this assumes that $input is \n terminated
}

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

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

Проф Концепт

set_time_limit(0);

$baseFile = "log.txt";
$tempFile = $baseFile . ".temp";

touch($tempFile);

$findAndReplace = array("abc" => "","efg"=>"WWW");

$fileTemp = fopen($tempFile, "a+");
$fileBase = fopen($baseFile,"r");

while ( !feof($fileBase))  {
    $var = trim(fgets($fileBase));
    if (array_key_exists($var, $findAndReplace)) {
        var_dump($var);
        $var = $findAndReplace[$var];
    }
    if (!empty($var))
        fwrite($fileTemp , $var . PHP_EOL);
}

fclose($fileBase);
fclose($fileTemp);
unlink($baseFile);
rename($tempFile, $baseFile);
Другие вопросы по тегам