Supprimer des lignes précises par leurs numéros dans un fich

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Supprimer des lignes précises par leurs numéros dans un fich

par phpdog » 21 janv. 2006, 16:23

Merci beaucoup pour votre patience :wink: :)

par Cyrano » 21 janv. 2006, 16:18

<?php
/* On créer la variable vers le fichier à traiter */
$filename = "fichier.php";
/* On ouvre le fichier défini par le variable */
$handle = fopen ($filename, "r");
/* On stocke le contenu du ficher dans une variable */
$contents = fread ($handle, filesize ($filename));
/* On ferme le fichier */
fclose ($handle);
/* On récupère chaque ligne du fichier en cherchant le séparateur "saut-de-ligne" (\n) */
$tableau = explode("\n", $contents);
?>
<pre>
<?php
/* On affiche le contenu du tableau à l'écran en utilisant les balises <pre> pour une mise en forme lisible */
var_dump($tableau);
?>
</pre>
<?php
/* On défini les lignes à supprimer */
$suppr = array(5, 6, 7);
$nouveau = "";
for($i = 0; $i < count($tableau); $i++)
{
    $j = $i+1;
    if(!in_array($j, $suppr))
    {
        $nouveau .= $tableau[$i];
    }
}
/* On ouvre le fichier défini par le variable */
$ouvre = fopen($filename, "w");
/* On réécrit le fichier sur lui même */
fwrite($ouvre, $nouveau); 
/* On ferme le fichier */
fclose($ouvre);
?>

par phpdog » 21 janv. 2006, 16:05

Merci beaucoup :wink:

Donc voila le code qui fonctionne:
<?php 
$filename = "fichier.php"; // On créer la variable vers le fichier à traiter
$handle = fopen ($filename, "r"); // On ouvre le fichier défini par le variable
$contents = fread ($handle, filesize ($filename)); // ?
fclose ($handle); // On ferme le fichier
$tableau = explode("\n", $contents); // ?
?> 
<pre> 
<?php 
var_dump($tableau); // ?
?> 
</pre> 
<?php 
$suppr = array(5, 6, 7);  // On défini les lignes à supprimer
$nouveau = ""; 
for($i = 0; $i < count($tableau); $i++) 
{ 
    $j = $i+1; 
    if(!in_array($j, $suppr)) 
    { 
        $nouveau .= $tableau[$i]; 
    } 
} 
$ouvre = fopen($filename, "w"); // On ouvre le fichier défini par le variable
fwrite($ouvre, $nouveau);  // On réécrit le fichier sur lui même
fclose($ouvre);  // On ferme le fichier
?> 
Pouriez vous m'aider a finaliser les commantaire, la ou il y a // ? ?

par Cyrano » 21 janv. 2006, 15:50

Il doit y avoir une erreur dans ton adaptation: voici le code complet que j'ai utilisé:
<?php
// Lit un fichier, et le place dans une chaîne
$filename = "texte.txt";
$handle   = fopen ($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
$tableau  = explode("\n", $contents);

/* Affichons le résultat */
?>
<pre>
<?php
var_dump($tableau);
?>
</pre>
<?php
/* On va ré-écrire le fichier en sautant les lignes 5, 6 et 7 */
$suppr = array(5, 6, 7);
$nouveau = "";
for($i = 0; $i < count($tableau); $i++)
{
    $j = $i+1;
    if(!in_array($j, $suppr))
    {
        $nouveau .= $tableau[$i];
    }
}
/* Maintenant, on peut ré-écrire le fichier : */
$fichier = "texte2.txt";
$ouvre = fopen($fichier, "w");
fwrite($ouvre, $nouveau);
fclose($ouvre);
?>
J'ai donc deux fichiers comme je t'ai expliqué dans ma précédente réponse. Essaye comme ça et quand ça fonctionnera, remplace le second fichier en mettant le même que le premier pour le ré-écrire.

par phpdog » 21 janv. 2006, 15:47

Code : Tout sélectionner

$nouveau = "";
Représente quoi ?

par phpdog » 21 janv. 2006, 15:46

J'ai donc adapter mon coce comme ceci:
<?php 
$suppr = array(5, 6, 7); 
$nouveau = ""; 
for($i = 0; $i < count($tableau); $i++) 
{ 
    $j = $i+1; 
    if(!in_array($j, $suppr)) 
    { 
        $nouveau .= $tableau[$i]; 
    } 
} 
$filename = "fichier.php"; // On créer la variable du nom du fichier à traiter 
$ouvre = fopen($filename, "w"); 
fwrite($ouvre, $nouveau); 
fclose($ouvre);

?> 
<pre> 
<?php 
var_dump($tableau); // ?
?> 
</pre>
Mais le fichier est toujours completement vidé.

par Cyrano » 21 janv. 2006, 15:31

Il faut utiliser une boucle. à la suite du code de tout à l'heure, essaye ceci:
<?php
/* On va ré-écrire le fichier en sautant les lignes 5, 6 et 7 */
$suppr = array(5, 6, 7);
$nouveau = "";
for($i = 0; $i < count($tableau); $i++)
{
    $j = $i+1;
    if(!in_array($j, $suppr))
    {
        $nouveau .= $tableau[$i];
    }
}
/* Maintenant, on peut ré-écrire le fichier : */
$fichier = "texte2.txt";
$ouvre = fopen($fichier, "w");
fwrite($ouvre, $nouveau);
fclose($ouvre);
?>
Note une chose: j'utilise un autre nom de fichier juste pour pas écraser l'original, mais tu peux aussi bien refaire avec l'original, ça fonctionnera aussi bien.

par phpdog » 21 janv. 2006, 15:21

Voila les erreurs:

Code : Tout sélectionner

Warning: fread(): Length parameter must be greater than 0. in h:\www\untitled-2.php on line 4 Notice: Undefined variable: tableau in h:\www\untitled-2.php on line 6 Notice: Undefined variable: tableau in h:\www\untitled-2.php on line 7 Notice: Undefined variable: tableau in h:\www\untitled-2.php on line 8 Warning: Wrong parameter count for fwrite() in h:\www\untitled-2.php on line 10

par phpdog » 21 janv. 2006, 15:13

J'ai essayer ceci:
<?php 
$filename = "fichier.php"; // On créer la variable du nom du fichier à traiter
$handle = fopen ($filename, "w"); // On ouvre le fichier défini par le variable
$contents = fread ($handle, filesize ($filename)); // ?
fclose ($handle); // On ferme le fichier
$tableau[5] ;
$tableau[6] ;
$tableau[7] ;
$tableau = explode("\n", $contents); // ?
fwrite($filename); // On réécrit le fichier sur lui même
?> 
<pre> 
<?php 
var_dump($tableau); // ?
?> 
</pre>
Le fichier est completement vidé.

par phpdog » 21 janv. 2006, 14:57

Oui 5 6 et 7

Se que je ne pige pas aussi s'est: Doije supprimer les lignes 5 6 et 7 ou récupérer toutes les autres ?

par Cyrano » 21 janv. 2006, 14:54

Est-ce que tu connais le numéro des lignes que tu veux supprimer ?

par phpdog » 21 janv. 2006, 14:51

Merci encore :wink:

Donc j'en suis la:
<?php 
$filename = "fichier.php"; 

$handle = fopen ($filename, "w"); 
$contents = fread ($handle, filesize ($filename)); 
fclose ($handle); 
$tableau = explode("\n", $contents); 
fwrite($filename);
?> 
<pre> 
<?php 
var_dump($tableau); 
?> 
</pre> 
Ce code vide completement le fichier, se que je ne voie pas s'est coment définir les lignes a supprimer.

par Cyrano » 21 janv. 2006, 14:38

Bon, si tu affiche le contenu, tu vas avoir tout le contenu sans réelles séparations entre les lignes.

Tu peux séparer les lignes et enregistrer tout ça dans un tableau indexé de la manière suivante. Imaginons un fichier texte comme ceci:
Ligne de texte 01
Ligne de texte 02
Ligne de texte 03
Ligne de texte 04
Ligne de texte 05
Ligne de texte 06
Ligne de texte 07
Ligne de texte 08
Ligne de texte 09
Ligne de texte 10
Ligne de texte 11
Ligne de texte 12
Ligne de texte 13
Ligne de texte 14
Ligne de texte 15
Ligne de texte 16
Ligne de texte 17
Ligne de texte 18
Ligne de texte 19
Ligne de texte 20
Ligne de texte 21
Ligne de texte 22
Ligne de texte 23
Ligne de texte 24
Ligne de texte 25
Ligne de texte 26
Ligne de texte 27
Ligne de texte 28
Ligne de texte 29
Ligne de texte 30
Rien de transcendant. Maintenant, reprennons ton code et ajoutons-y quelques détails:
<?php
// Lit un fichier, et le place dans une chaîne
$filename = "texte.txt";
$handle = fopen ($filename, "r");
$contents = fread ($handle, filesize ($filename));
fclose ($handle);
$tableau = explode("\n", $contents);
?>
<pre>
<?php
var_dump($tableau);
?>
</pre>
À l'affichage, tu vas voir ceci:

Code : Tout sélectionner

array(31) { [0]=> string(18) "Ligne de texte 01 " [1]=> string(18) "Ligne de texte 02 " [2]=> string(18) "Ligne de texte 03 " [3]=> string(18) "Ligne de texte 04 " [4]=> string(18) "Ligne de texte 05 " [5]=> string(18) "Ligne de texte 06 " [6]=> string(18) "Ligne de texte 07 " [7]=> string(18) "Ligne de texte 08 " [8]=> string(18) "Ligne de texte 09 " [9]=> string(18) "Ligne de texte 10 " [10]=> string(18) "Ligne de texte 11 " [11]=> string(18) "Ligne de texte 12 " [12]=> string(18) "Ligne de texte 13 " [13]=> string(18) "Ligne de texte 14 " [14]=> string(18) "Ligne de texte 15 " [15]=> string(18) "Ligne de texte 16 " [16]=> string(18) "Ligne de texte 17 " [17]=> string(18) "Ligne de texte 18 " [18]=> string(18) "Ligne de texte 19 " [19]=> string(18) "Ligne de texte 20 " [20]=> string(18) "Ligne de texte 21 " [21]=> string(18) "Ligne de texte 22 " [22]=> string(18) "Ligne de texte 23 " [23]=> string(18) "Ligne de texte 24 " [24]=> string(18) "Ligne de texte 25 " [25]=> string(18) "Ligne de texte 26 " [26]=> string(18) "Ligne de texte 27 " [27]=> string(18) "Ligne de texte 28 " [28]=> string(18) "Ligne de texte 29 " [29]=> string(18) "Ligne de texte 30" }
Comme tu peux voir, chaque ligne est isolée : attention cependant à un détail: les index de $tableau commencent à 0 pour la ligne 1 du fichier.

Il te reste donc maintenant à définir quelles lignes tu veux supprimer et à créer une boucle pour créer le contenu du nouveau fichier en sautant les lignes à supprimer: puis tu ré-écris le fichier avec fwrite() en écrasant l'ancien. Il faudra pour celà l'ouvrir non pas en mode "r" mais "w" ou "w+"

par phpdog » 21 janv. 2006, 14:37

Et sa s'est pour supprimer les lignes alors ?
$ligne[0] ; // envoi la ligne 1 
$ligne[1] ; // envoi la ligne 2 
$ligne[2] ; // envoi la ligne 3 

par DarkBlue » 21 janv. 2006, 14:34

c est tres simple , une fois le explode fais via par exmple :
$ligne=explode("\r\n",$contenufichier); 
les lignes sont repérées ainsi :
$ligne[0] ; // envoi la ligne 1
$ligne[1] ; // envoi la ligne 2
$ligne[2] ; // envoi la ligne 3
et ainsi de suite !