如何用php删除文件中的一行?

时间:2011-04-19 07:17:40

标签: php file awk line

我有一个名为$dir的文件和一个名为$line的字符串,我知道这个字符串是该文件的完整行,但我不知道它的行号,我想删除它从文件中,我该怎么办?

是否可以使用awk?

9 个答案:

答案 0 :(得分:18)

逐行读取行,并将匹配行以外的所有行写入另一个文件。然后替换原始文件。

答案 1 :(得分:11)

这将只查看每一行,如果不是你要删除的内容,它将被推送到一个将被写回文件的数组。 see this

 $DELETE = "the_line_you_want_to_delete";

 $data = file("./foo.txt");

 $out = array();

 foreach($data as $line) {
     if(trim($line) != $DELETE) {
         $out[] = $line;
     }
 }

 $fp = fopen("./foo.txt", "w+");
 flock($fp, LOCK_EX);
 foreach($out as $line) {
     fwrite($fp, $line);
 }
 flock($fp, LOCK_UN);
 fclose($fp);  

答案 2 :(得分:10)

$contents = file_get_contents($dir);
$contents = str_replace($line, '', $contents);
file_put_contents($dir, $contents);

答案 3 :(得分:3)

另一种方法是逐行读取文件,直到找到匹配项,然后将文件截断到该点,然后附加其余行。

答案 4 :(得分:2)

如果您要在一行中查找子字符串(ID)并想要用新行替换旧行,这也很好。

<强>代码:

$contents = file_get_contents($dir);
$new_contents= "";
if( strpos($contents, $id) !== false) { // if file contains ID
    $contents_array = preg_split("/\\r\\n|\\r|\\n/", $contents);
    foreach ($contents_array as &$record) {    // for each line
        if (strpos($record, $id) !== false) { // if we have found the correct line
            pass; // we've found the line to delete - so don't add it to the new contents.
        }else{
            $new_contents .= $record . "\r"; // not the correct line, so we keep it
        }
    }
    file_put_contents($dir, $new_contents); // save the records to the file
    echo json_encode("Successfully updated record!");
}
else{
    echo json_encode("failed - user ID ". $id ." doesn't exist!");
}

示例:

输入:&#34; 123,学生&#34;

旧文件:

  

ID,职业

     

123,学生

     

124,砖层

运行代码会将文件更改为:

新文件:

  

ID,职业

     

124,砖层

答案 5 :(得分:2)

可以在不使用awk的情况下解决:

function remove_line($file, $remove) {
    $lines = file($file, FILE_IGNORE_NEW_LINES);
    foreach($lines as $key => $line) {
        if($line === $remove) unset($lines[$key]);
    }
    $data = implode(PHP_EOL, $lines);
    file_put_contents($file, $data);
}

答案 6 :(得分:0)

像这样:

file_put_contents($filename, str_replace($line . "\r\n", "", file_get_contents($filename)));

答案 7 :(得分:0)

我认为处理文件的最佳方法是将它们编辑为字符串。

首先,获取文件的所有行(以下代码可以压缩):

$file = @fopen($dir, 'r'); # As you said, $dir is your filename
if ($file) { # Ending bracket is at the end
    if (filesize($dir)) { # Checks whether the file size is not zero (we know file exists)
        $fileContent = fread($file, filesize($dir)); # Reads all of the file
        fclose($file);
    } else {
        // File is empty
        exit; # Stops the execution (also you can throw an exception)
    }
    $fileLineByLine = explode(PHP_EOL, $fileContent); # Divides the file line by line

在这里,您可以执行搜索:

    $key = false; # By default, your string $line is not in the file (false)
    foreach ($fileLineByLine as $lineNumber => $thisLine)
        if ($thisLine === $line)
            $key = $lineNumber; # If $line found in file, set $key to this line number

简单地说,您可以删除行$ key + 1:

    if ($key !== false) # If string $line found in the file
        unset($fileLineByLine[$key]); # Remove line $key + 1 (e.g. $key = 2, line 3)

最后,您必须将更改保存到文件中:

    $newFileContent = implode(PHP_EOL, $fileLineByLine); # Joins the lines together
    $file = fopen($dir, "w"); # Clears the file
    if ($file) {
        fwrite($file, $newFileContent); # Saves new content
        fclose($file);
    }
} # Ends 'if ($file) {' above

您也可以将上面的代码设置为函数。

注意:

  • $ line不能包含\ n等换行符。你必须删除它们:

    $line = str_replace(PHP_EOL, '', $line);
    
  • 请勿使用

    $fileLineByLine[$key] = "";
    

    而不是

    unset($fileLineByLine[$key]);
    

    因为第一种情况不会删除该行,它只会清除该行(并且将保留不需要的空行)。在这种情况下,implode()也为$ fileLineByLine [$ key]添加一个新行,该行为空;否则如果你取消设置变量,它将不可用(并且implode()找不到它。)

答案 8 :(得分:0)

将文本转换为数组,删除第一行并重新转换为文本

$line=explode("\r\n",$text);
unset($line[0]);
$text=implode("\r\n",$line);