如何从大文件中获取最后1000行然后将其删除?

时间:2018-07-15 16:41:53

标签: php file

解决了2个步骤:


我有一个大文件,我想从文件末尾取出1000行,然后将其删除。

我目前正在使用此

function deleteLineInFile($file,$string)
{
    $i=0;
    $array=array();

    $read = fopen($file, "r") or die("can't open the file");
    while(!feof($read)) {
        $array[$i] = fgets($read);  
        ++$i;
    }
    fclose($read);

    $write = fopen($file, "w") or die("can't open the file");
    foreach($array as $a) {
        if(!strstr($a,$string)) fwrite($write,$a);
    }
    fclose($write);
}
$goods = '';
$file = file("../products/".$PidFileName);
for ($i = max(0, count($file)-1001); $i < count($file); $i++) {
    $goods = $goods.$file[$i] . '<br />';
    deleteLineInFile("../products/".$PidFileName, $file[$i]);
}

我要保存在$goods中得到的行

但是,由于文件大小而超时。

2 个答案:

答案 0 :(得分:2)

如果要从EOF中获得N行,可以使用SPLFileObject(PHP 5.1中已添加):

DoCmd.SetWarnings False

答案 1 :(得分:0)

要从大文件中获取行后将其删除:

最好的方法是使用sed |但是,如果您无权使用exec()函数,那么可以使用此函数。

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

函数来源:https://stackoverflow.com/a/2159135/8524395

要删除该行,可以这样:

replace_file('myfile.txt', 'RemoveThisPlease', '');

  • 如果您使用 MrSmile 的答案来获得答案,则将{RemoveThisPlease“替换为$line