Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除TXT文件中的特定行_Php - Fatal编程技术网

Php 删除TXT文件中的特定行

Php 删除TXT文件中的特定行,php,Php,我有一个包含数百万行文本的.txt文件 下面的代码删除.txt文件中的特定行(.com域)。但大文件不能:( 我想删除某些行并将它们放在另一个文件中 例如,站点的域名列表。剪切.com域并将其粘贴到另一个文件中…这里有一种使用和处理临时文件的方法 $fileName = 'whatever.txt'; $linesToDelete = array( 3, 5 ); // Working File $file = new SplFileObject( $fileName, 'a+' ); $

我有一个包含数百万行文本的.txt文件

下面的代码删除.txt文件中的特定行(.com域)。但大文件不能:(


我想删除某些行并将它们放在另一个文件中

例如,站点的域名列表。剪切.com域并将其粘贴到另一个文件中…

这里有一种使用和处理临时文件的方法

$fileName = 'whatever.txt';
$linesToDelete = array( 3, 5 );

// Working File
$file = new SplFileObject( $fileName, 'a+' );
$file->flock( LOCK_EX );
// Temp File
$temp = new SplTempFileObject( 0 );
$temp->flock( LOCK_EX );
// Wite the temp file without the lines
foreach( $file as $key => $line )
{
  if( in_array( $key + 1, $linesToDelete ) === false )
  {
    $temp->fwrite( $line );
  }
}
// Write Back to the main file
$file->ftruncate(0);
foreach( $temp as $line )
{
  $file->fwrite( $line );
}
$file->flock( LOCK_UN );
$temp->flock( LOCK_UN );
这可能会很慢,但在我的windows xampp安装程序中,一个40兆、140000行的文件需要2.3秒。写入临时文件并移动文件可以加快速度,但我不想在您的环境中设置文件权限


编辑:使用重命名/移动而不是二次写入的解决方案

$fileName = __DIR__ . DIRECTORY_SEPARATOR . 'whatever.txt';
$linesToDelete = array( 3, 5 );

// Working File
$file = new SplFileObject( $fileName, 'a+' );
$file->flock( LOCK_EX );
// Temp File
$tempFileName = tempnam( sys_get_temp_dir(), rand() );
$temp = new SplFileObject( $tempFileName,'w+');
$temp->flock( LOCK_EX );
// Write the temp file without the lines
foreach( $file as $key => $line )
{
  if( in_array( $key + 1, $linesToDelete ) === false )
  {
    $temp->fwrite( $line );
  }
}
// File Rename
$file->flock( LOCK_UN );
$temp->flock( LOCK_UN );
unset( $file, $temp ); // Kill the SPL objects relasing further locks
unlink( $fileName );
rename( $tempFileName, $fileName );
下面是一种使用和处理临时文件的方法

$fileName = 'whatever.txt';
$linesToDelete = array( 3, 5 );

// Working File
$file = new SplFileObject( $fileName, 'a+' );
$file->flock( LOCK_EX );
// Temp File
$temp = new SplTempFileObject( 0 );
$temp->flock( LOCK_EX );
// Wite the temp file without the lines
foreach( $file as $key => $line )
{
  if( in_array( $key + 1, $linesToDelete ) === false )
  {
    $temp->fwrite( $line );
  }
}
// Write Back to the main file
$file->ftruncate(0);
foreach( $temp as $line )
{
  $file->fwrite( $line );
}
$file->flock( LOCK_UN );
$temp->flock( LOCK_UN );
这可能会很慢,但在我的windows xampp安装程序中,一个40兆、140000行的文件需要2.3秒。写入临时文件并移动文件可以加快速度,但我不想在您的环境中设置文件权限


编辑:使用重命名/移动而不是二次写入的解决方案

$fileName = __DIR__ . DIRECTORY_SEPARATOR . 'whatever.txt';
$linesToDelete = array( 3, 5 );

// Working File
$file = new SplFileObject( $fileName, 'a+' );
$file->flock( LOCK_EX );
// Temp File
$tempFileName = tempnam( sys_get_temp_dir(), rand() );
$temp = new SplFileObject( $tempFileName,'w+');
$temp->flock( LOCK_EX );
// Write the temp file without the lines
foreach( $file as $key => $line )
{
  if( in_array( $key + 1, $linesToDelete ) === false )
  {
    $temp->fwrite( $line );
  }
}
// File Rename
$file->flock( LOCK_UN );
$temp->flock( LOCK_UN );
unset( $file, $temp ); // Kill the SPL objects relasing further locks
unlink( $fileName );
rename( $tempFileName, $fileName );

虽然可以使用数十行PHP代码,但一行shell代码就可以了

$ grep Bar.com stuff.txt > stuff2.txt
或者作为PHP

system ("grep Bar.com stuff.txt > stuff2.txt");

虽然可以使用数十行PHP代码,但一行shell代码就可以了

$ grep Bar.com stuff.txt > stuff2.txt
或者作为PHP

system ("grep Bar.com stuff.txt > stuff2.txt");

可能是因为文件太大,占用了太多的空间。 执行
文件('test.txt')
时,它会将整个文件读入一个数组。 相反,您可以尝试使用
生成器

GeneratorsExample.php

<?php
class GeneratorsExample {
    function file_lines($filename) {
        $file = fopen($filename, 'r'); 
        while (($line = fgets($file)) !== false) {
            yield $line; 
        } 
        fclose($file); 
    }

    function copyFile($srcFile, $destFile) {
        foreach ($this->file_lines($srcFile) as $line) {
            if(!strstr($line, ".com"))  {
                $f = fopen($destFile, "a"); 
                fwrite($f, $line); 
                fclose($f); 
            }
        }
 }
}

可能是因为文件太大,占用了太多空间。
执行
文件('test.txt')
时,它会将整个文件读入一个数组。 相反,您可以尝试使用
生成器

GeneratorsExample.php

<?php
class GeneratorsExample {
    function file_lines($filename) {
        $file = fopen($filename, 'r'); 
        while (($line = fgets($file)) !== false) {
            yield $line; 
        } 
        fclose($file); 
    }

    function copyFile($srcFile, $destFile) {
        foreach ($this->file_lines($srcFile) as $line) {
            if(!strstr($line, ".com"))  {
                $f = fopen($destFile, "a"); 
                fwrite($f, $line); 
                fclose($f); 
            }
        }
 }
}


但是大文件不能:(
这是什么意思?大文件有什么问题?为什么不工作?请注意,PHP使用unix文件流控制器(r,r+,w,…)。您可以将某些内容附加到文件或重写文件,但不能插入或删除anything@clinomaniac当文件包含数百万行时,程序将不会运行。但它运行小文件
,但大文件不能:(
这意味着什么?大文件有什么问题?为什么不工作?请注意,PHP使用unix文件流控制器(r,r+,w,…)。您可以将某些内容附加到文件或重写文件,但不能插入或删除anything@clinomaniac当文件包含数百万行时,程序将不会运行。但它运行于小文件HA,让我们用PHP
exec()来包装它
也是函数!它不应该是
grep-F-v.com
?无论哪种方式,这个问题都用
PHP
标记,并且有PHP中的代码示例,做出这个答案是离题的。哈,让我们用PHP
exec()来包装它
也是函数!不应该是
grep-F-v.com
?不管怎样,这个问题用
PHP
标记,并且有PHP的代码示例,做出这个答案是离题的。你得到了什么错误?请看更新的答案。问题有些解决了。但仍然没有完全解决@ashiranjan你得到了什么错误?请查看更新的答案。问题已解决。但它仍然没有完全解决@ashishranjan最适合大小非常大的文件的解决方案。编辑我的450+mb大小的文件花费了几秒钟:)谢谢@scuzzy@FahadAli很高兴听到这个,第一个或第二个选项是最好的?我写这个答案已经有一段时间了,所以我忘记了:D:D当然你会忘记,因为这是一个2年前的答案LOL!我使用了第二个选项,它对我有效,因为这也是我在删除特定文件后使用相同文件名的要求来自我的文件的行。干杯!最适合于大小非常大的文件的解决方案。编辑450 mb以上的文件需要几秒钟:)谢谢@scuzzy@FahadAli很高兴听到这个,第一个或第二个选项是最好的?我写这个答案已经有一段时间了,所以我忘记了:D:D当然你会忘记,因为这是一个2年前的答案LOL!我使用了第二个选项,它对我有效,因为这也是我在删除特定文件后使用相同文件名的要求我档案里的台词,干杯!