从文件中搜索和删除/添加行的最快方法

时间:2012-10-10 22:47:48

标签: php performance sorting file-io file-search

我想知道从潜在的大文件中删除特定行的最快方法是什么(如果存在)。

所以我想要以下一行

abc

将从文件中删除

yxz
srtabc
abc
efg

成为

yxz
srtabc
efg

另外,我想在文件中添加一行,如果它还不存在的话。

文件的顺序无关紧要,如果它为搜索提供了性能提升,则可以进行排序。

性能从来都不是我的强项,所以我在确定最佳路径方面遇到了一些麻烦。

2 个答案:

答案 0 :(得分:0)

我不建议使用file_put_contentsfile_get_contents,因为它会立即将文件的所有内容加载到PHP中,如果您使用大文件,这对您不起作用。< / p>

你可以使用2个文件..并在另一个文件后读取它们.....替换你需要替换的任何内容然后在最后重命名....这只在使用非常大的文件时有效< / p>

概念教授

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);

答案 1 :(得分:0)

为了表现,请不要使用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
}