web-dev-qa-db-fra.com

Comment supprimer une ligne du fichier avec php?

J'ai un fichier nommé $dir et une chaîne nommée $line, je sais que cette chaîne est une ligne complète de ce fichier mais je ne connais pas son numéro de ligne et je souhaite le supprimer du fichier. Que dois-je faire?

Est-il possible d'utiliser awk?

12
ibrahim
$contents = file_get_contents($dir);
$contents = str_replace($line, '', $contents);
file_put_contents($dir, $contents);
10
Naveed Ahmad

Lisez les lignes une par une et écrivez toutes les lignes sauf la ligne correspondante dans un autre fichier. Puis remplacez le fichier d'origine.

18

cela va juste regarder chaque ligne et si ce n'est pas ce que vous voulez supprimer, il sera poussé vers un tableau qui sera écrit dans le fichier. regarde ça

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

Une autre approche consiste à lire le fichier ligne par ligne jusqu'à ce que vous trouviez une correspondance, puis tronquez le fichier à ce point et ajoutez ensuite le reste des lignes.

3
mpen

Il peut être résolu sans utiliser 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);
}
2
Nabi K.A.Z.

Cela est également utile si vous recherchez une sous-chaîne (ID) dans une ligne et souhaitez remplacer l'ancienne ligne par la nouvelle.

Code:

$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!");
}

Exemple:

entrée: "123, étudiant"

Ancien fichier:

ID, profession

123, étudiant

124, couche de brique

L'exécution du code modifiera le fichier en:

Nouveau fichier:

ID, profession

124, couche de brique

2
ChickenFeet

Je pense que la meilleure façon de travailler avec des fichiers est de les éditer sous forme de chaînes.

Tout d’abord, récupérez toutes les lignes du fichier (les codes suivants peuvent être compressés):

$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

Ici, vous pouvez effectuer votre recherche:

    $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

Simplement, vous pouvez supprimer la ligne $ 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)

Enfin, vous devez enregistrer vos modifications dans le fichier:

    $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

Vous pouvez également définir le code ci-dessus en tant que fonction.

Remarques:  

  • $ line ne doit pas avoir de caractères de nouvelle ligne comme\n. Vous devez les enlever:

    $line = str_replace(PHP_EOL, '', $line);
    
  • Ne pas utiliser

    $fileLineByLine[$key] = "";
    

    au lieu de

    unset($fileLineByLine[$key]);
    

    parce que le premier cas ne supprime pas la ligne, il efface simplement la ligne (et une ligne vide non désirée reste). Dans ce cas, implode () ajoute une nouvelle ligne également pour $ fileLineByLine [$ key] qui est vide; sinon, si vous supprimez une variable, elle sera indisponible (et implode () ne la trouvera pas).

0
MAChitgarha

Comme ça:

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