0

ファイルが存在する場合、潜在的に大きなファイルから特定の行を削除する最速の方法は何だろうと思っています。

たとえば、次の行が必要です

abc

ファイルから削除する

yxz
srtabc
abc
efg

なり

yxz
srtabc
efg

また、ファイルがまだ存在しない場合は、ファイルに行を追加したいと思います。

ファイルの順序は重要ではなく、検索のパフォーマンスが向上する場合は並べ替えることができます。

パフォーマンスは私の長所ではありませんでした。そのため、ここに進むための最適なパスを決定するのに少し苦労しています。

4

2 に答える 2

0

file_put_contentsorを使用file_get_contents すると、ファイルのすべてのコンテンツが一度に PHP に読み込まれ、大きなファイルを操作している場合、これは機能しないため、アドバイスしません。

2 つのファイルを操作できます..そして、それらを 1 行ずつ読み込んでいきます..必要なものをすべて置き換え、最後に名前を変更します....これは、非常に大きなファイルを操作する場合にのみ効率的です。

概念教授

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);
于 2012-10-10T22:50:47.967 に答える
0

パフォーマンスのために、php を使用しないでください。

しかし、あなたが主張し、1 回の置換操作だけが必要な場合は、ファイル全体を読み取り、その行を (文字列として) 置き換えて、書き戻します。つまり、ファイルを別々の行に分割しないでください。必要以上に処理が遅くなります。

これはトリックにすべきです:

$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
}
于 2012-10-10T23:06:58.690 に答える