簡體   English   中英

刪除TXT文件中的特定行

[英]Delete a specific line in a TXT file

我有一個.txt文件,其中包含數百萬行文本

下面的代碼刪除.txt文件中的特定行(.com域)。 但是大文件不能做:(

<?php 
$fname = "test.txt";
$lines = file($fname);
foreach($lines as $line) if(!strstr($line, ".com")) $out .= $line; 
$f = fopen($fname, "w"); 
fwrite($f, $out); 
fclose($f); 
?> 

我想刪除某些行並將其放在另一個文件中

例如,網站的域名列表。 剪切.com域並將其粘貼到另一個文件中...

這是一種使用http://php.net/manual/en/class.splfileobject.php並使用臨時文件的方法。

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

可能由於文件大而占用太多空間。 當您執行file('test.txt') ,它將整個文件讀入一個數組。 相反,您可以嘗試使用Generators

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

CallingFile.php

<?php
    include('GeneratorsExample.php');
    $ob = new GeneratorsExample();
    $ob->copyFile('file1.txt', 'file2.txt')

雖然您可以使用數十行PHP代碼,但可以使用一行shell代碼。

$ grep Bar.com stuff.txt > stuff2.txt

或作為PHP

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM