Parser un fichier.txt en PHP

Parser un fichier.txt en PHP - PHP - Programmation

Marsh Posté le 13-01-2015 à 10:38:42    

Bonjour,
 
Je suis novice en php et j'aurais besoin de votre aide :)  
Alors le problème est le suivant je possède un fichier .txt qui est structurer de cette façon:
 
ip : 91.121.58.96 91.121.153.42 91.121.153.42 (Le nombre d'IP n'a pas de limite et peut être plus grand)
user : USER
password : PWD
src_path : /var/www/
dst_path : /tmp/data/
packet_size : 30000
 
j'aimerais crée un formulaire pour qu'un utilisateur puisse modifier n'importe quelle données par exmple une des trois adresse ip présente, la taille des paquets, ou tous simplement le chemin /www/.
j'arrive a ouvrir mon fichier en php le parcourir l'afficher mais je bloque sur la modification des données.

Reply

Marsh Posté le 13-01-2015 à 10:38:42   

Reply

Marsh Posté le 13-01-2015 à 11:15:44    

Ca serait sans doute plus facile à modifier tes données si elles étaient dans une BD. Car modifier un fichier txt avec pas mal de données, ça risque d'être un peu compliqué et pourri en terme de perfs. Si ton fichier fait moins d'1 Mo, tu peux le charger dans une variable de type tableau associatif, via un parsing. Tu fais tes modifs dans la variable direct via une IHM puis tu régénères le fichier à la fin. Si le fichier est plus conséquent, t'auras plutôt intérêt à le charger dans une BD, faire les modifs via une IHM puis regénérer le fichier à partir de la BD à la fin.
 
La limite du "1 Mo" est donnée "à la louche". Des tests permettront de voir à partir de quelle taille ça commence à ramer ;)
 
Edit : pour le parsing : tu charges ligne après ligne et tu utilises des regexp pour "découper" les données et les avoir de manière atomique. En fonction de la ligne lue précédemment et connaissance le format de ficheir, tu vas en déduire la regexp à utiliser pour la ligne suivante.


Message édité par rufo le 13-01-2015 à 11:17:15

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-01-2015 à 11:22:52    

j'ai penser a la BD mais les fichiers n'arriverons pas a 1mo c'est pour cela que une BD est inutile.
Je te remercie pour ces informations mais comme je l'ai indiquer je suis vraiment un novice lol donc si ca ne te dérange pas de m'expliquer ceci avec des mots plus simple ca serais vraiment sympas :)

Reply

Marsh Posté le 13-01-2015 à 11:39:10    

Regarde du coté de la fonction : parse_in_file, dans les commentaires il'y a je crois une fonctions récrire le fichier.
 
Le reste n'est plu que de l'affichage / traitement d'un formulaire.


---------------
D3
Reply

Marsh Posté le 13-01-2015 à 11:56:55    

j'ai pas trouver le commentaire dont tu me parle comme je l'ai dit la lecture l'affichage et meme l'écriture dans un fichier je peut le faire mon seul souci est de savoir comment je doit faire pour par exemple modifier la 5eme adresse IP ou juste le size du packet.
J'ouvre mon fichier avec la fonction fopen jusqu'a la tous va bien  
// ouverte, lecture , fermeture du fichier et stockage dans un tableau
    // Ici, aussi, j'ai utilisé __FILE__ qui représente le fichier courant
    // mais dans une utilisation courante on utilisera quelque chose comme
    // "/chemin/nomdufichier"
    $tableau = file("conf.txt" );
     
    // affichage du contenu du tableau
    for ($i=0; $i<count($tableau); $i++)  
    {
        echo htmlEntities($tableau[$i]) . "<br/>";
    }
 
voila une fois le fichier afficher je ne sais pas comment attaquer les informations que je veux modifier  

Reply

Marsh Posté le 13-01-2015 à 12:02:03    

Tu as ouvert la doc de parse_ini_file ?
$ini_array = parse_ini_file("sample.ini" );
print_r($ini_array);


---------------
D3
Reply

Marsh Posté le 13-01-2015 à 12:04:25    

oui j'ai essayer avec la fonction parse_ini_file en remplacant sample.ini par mon conf.txt mais cela ne fait rien

Reply

Marsh Posté le 13-01-2015 à 13:31:40    

file() pour lire le fichier.
preg_match() pour les expressions régulières. Explode() pourra t'intéresser aussi.
file_put_contents() pour écrire le fichier. implode() pourra éventuellement te servir aussi.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-01-2015 à 13:57:29    

pour lire le fichier aucun soucis écrire aussi ma question plus exactement est comment faire pour modifier par exemple la 3eme IP ou une autre valeur  
mon code pour lire le fichier est le suivant  
 
$tableau = file("conf.txt" );
     
    // affichage du contenu du tableau
   for ($i=0; $i<count($tableau); $i++)  
  {
 
     echo htmlEntities($tableau[$i]) . "<br/>";
     
  }
 
jusqu'a la rien de fou j'ouvre le fichier et je met une boucle pour dérouler toutes les lignes de mon fichier une fois que tout est afficher j'aimerais par exemple pouvoir modifier n'importe qu'elle données

Reply

Marsh Posté le 13-01-2015 à 14:18:39    

Dans ta boucle, en plus d'afficher (ou, au lieu de), tu y mets l'algo qui va parser chaque ligne -> preg_match() et explode(). Le résultat du parsing sera mis dans une autre variable de type tableau associatif ayant la structure qui t'arrange le plus.
 
Ex :

Code :
  1.        [0] => array("ip" => array(),
  2.                          "user" => "",
  3.                          "password" => "",
  4.                          "src_path" => "",
  5.                          "dst_path" => "",
  6.                          "packet_size" => 0
  7.                         ),
  8.       [1] => array("ip" => array(),
  9.                         ...
  10. );


Les n° de 0 à n représentent les différents enregistrements. Pour chaque enregistrement, tu retrouves toutes les infos.
 
Avec cette structure, ça va être assez facile d'afficher les données en tableau paginé (par ex), de modifier un enregistrement et de reconstruire le fichier ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-01-2015 à 14:18:39   

Reply

Marsh Posté le 13-01-2015 à 14:27:08    

ta solution me semble bonne mais je ne vois pas comment l'intégrer a ma boucle

Reply

Marsh Posté le 13-01-2015 à 15:19:46    

j'ai bricoler un petit scripte qui marche presque lol j'ai une seul erreur
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
    $fichier="conf.txt"; // Nom du fichier à modifier
 
        if(isset($_POST['boutton']))
        {    
        unlink($fichier); // suppression du fichier pour le remplacer par le nouveau avec les nouveau éléments
        $ouverture=fopen("$fichier","a+" ); // Création du nouveau fichier et ouverture du fichier
        fwrite($ouverture,"$_POST[modif]" ); // ecriture
        fclose($ouverture); // fermeture du fichier
        echo '<h2>Modification effectue</h2>'; // Affichage validation
        }
 
?>
    <form method="post" action="modification.php">
    <TEXTAREA name="modif" rows="10" COLS="40">
<?
    echo file_get_contents($fichier);
?>
    </TEXTAREA>
    <br/><input type="submit" name="boutton" value="Modifier">
    </form>
 
 
je peut acceder a toute les info et modifier mais le probleme est lorsque je clique sur modifier j'ai une erreur  
 
Not Found
 
The requested URL /modification.php was not found on this server.

Reply

Marsh Posté le 13-01-2015 à 16:53:59    

fopen/fwrite/fclose = file_put_contents()
Pourquoi faire (mal en plus !) en 3 instructions ce que tu peux faire en une seule. En effet, le mode "a+", c'est pour faire du "append" (ajout du contenu à la fin du fichier s'il existe déjà). Alors certes, tu fais un unlink() avant. Mais dans ton cas d'utilisation, t'a besoin que du mode w+ (écriture/écrasement).
 
Après, c'est vraiment pas propre du tout de permettre à l'utilisateur de modifier le fichier txt direct sans contrôle des données. dans ce cas, autant utiliser un bête éditeur de texte pour modifier le fichier :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-01-2015 à 16:59:22    

tout a fait d'accord avec toi mais mon maitre de stage m'oblige a utiliser cette méthode malheureusement alors que ceci peut être fait plus simplement. J'ai réussi a faire fonctionner mon scripte voila ce que ca donne
 
<?php
    $fichier="conf.txt"; // Nom du fichier à modifier
 
        if(isset($_POST['boutton'])) {    
        //if(is_file($fichier)) unlink($fichier); //si le fichier existe :  suppression du fichier pour le remplacer par le nouveau avec les nouveau éléments
        $ouverture=fopen("$fichier","w" ); // Création du nouveau fichier et ouverture du fichier avec le mode w on ouvre le fichier qu'en écriture et unlink devient inutile car le fichier est vidé automatiquement
        fwrite($ouverture,"$_POST[modif]" ); // ecriture
        fclose($ouverture); // fermeture du fichier
        echo '<h2>Modification effectue</h2>'; // Affichage validation
        }
 
?>
    <form method="post" action=""> <!-- j'ai modifié action pour qu'il soit compatible peut importe le nom de la page-->
    <textarea name="modif" rows="10" COLS="40"><?php // fait attention de bien collé les déclaration php au balises html sinon ca ecria les espace dans ton fichier
    if(is_file($fichier)) echo file_get_contents($fichier);  
?></textarea>
    <br/><input type="submit" name="boutton" value="Modifier">
    </form>
 
le scripte marche et fait exactement ce que je veux faire le souci est juste au niveau de la mise en forme j'aimerais juste que ca ressemble a ca  
 
IP: LES ADRESSES (textarea)      (boutton modifier)
User:.....(textarea)                          (boutton modifier
etc jusqu'a la fin du fichier

Reply

Marsh Posté le 13-01-2015 à 17:19:44    

"mon maitre de stage m'oblige a utiliser cette méthode" :??:  
Je serais curieux de connaître ses raisons parce que ça n'a, pour moi, aucun sens.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-01-2015 à 17:22:37    

pas que pour toi mais la raison est simple le fichier de configuration n'est pas volumineux et il faut que l'utilisateur puisse lui meme modifier ses information car chaque fichier est propre a un utilisateur précis et ceci doit être fait via une page j'espère que cela t'aide a comprendre le GENIE de mon maitre de stage lol
Par contre tu n'aurait pas une solution pour ma question sur le formulaire stp pour faire ceci sur ma page  
 
IP: LES ADRESSES (textarea)      (boutton modifier)  
User:.....(textarea)                          (boutton modifier  
etc jusqu'a la fin du fichier

Reply

Marsh Posté le 13-01-2015 à 17:35:36    

Quel est le rapport entre la taille du fichier et interdire d'utiliser  file_put_contents() à la place de fopen/fwrite/fclose ? :pt1cable:  
 
Pour ton pb, ben tu parses ton fichier pour récupérer les IP et users, pour la mise en forme, HTML + css (float:left; et float:clear; je te laisse chercher sur la doc du CSS la signification de ça).
 
Eventuellement, tu peux faire un tableau pour positionner tes éléments, mais c'est pas très propre :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-01-2015 à 17:39:12    

ah j'ai pas compris que c'etait pour le fille_put lol il ma obliger a utiliser cette méthode pour ne pas avoir a passer par une BD  
En tout cas merci encore pour votre aide :)

Reply

Marsh Posté le 13-01-2015 à 17:45:03    

Effectivement, si les fichiers sont petits, logique de pas passer par une BD; c'est ce que je t'avais expliqué dans mon premier post. Mais la structure du tableau associatif donnée dans mon 3ème post partait du postulat que tu ne manipulerais que des fichiers (donc pas de BD). Au moins, t'avais pas confondu BD et tableau associatif ? :heink:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-01-2015 à 17:52:56    

non je n'ai pas confondu je n'ai juste pas bien compris ta méthode de tableau associatif si tu peut me l'expliquer plus en détail si ca ne te dérange pas bien sure

Reply

Marsh Posté le 14-01-2015 à 09:54:16    

Le tableau associatif est juste une structure de données que tu vas charger via le parsing de ton fichier. La structure proposée permet de manipuler assez facilement les données de ton fichier une fois parsé. Les indices 0 à n représentent les différents groupes de données (une groupe allant du champ ip à packet_size). Dans chaque groupe, on retrouve les champs de ton fichier.
 
Ex : si tu veux modifier la 3ème ip du 2ème groupe de données de ton fichier, avec une variable php qui contient la structure et qui s'appellerait $ArrayContent, ça donnerait :
$ArrayContent[1]["ip"][2] = $NewIP;
 
Si tu veux modifier le champ "src_path" du 4ème groupe de données de ton fichier :
$ArrayContent[3]["src_path"] = $NewSrcPath;
 
C'est plus clair ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-01-2015 à 10:02:06    

oui beaucoup plus clair, je te remercie encore pour ton aide ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed