IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Parcourir un fichier CSV avec fgetcsv


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut Parcourir un fichier CSV avec fgetcsv
    Bonjour à tous,

    J'ai un fichier CSV qui se compose de la façon suivante :

    "id";"serveur";"responsable";"os"
    "1";"srv1";"systeme";"windows 2003"
    "2";"srv2";"reseaux";"windows 2003"
    "3";"srv3";"dadabase";"linux"
    "4";"srv4";"appli";"windows 2008"
    "5";"srv5";"appli";"linux"
    "6";"srv6";"systeme";"windows 2008"
    "7";"srv7";"systeme";"linux"
    "8";"srv8";"reseaux";"windows 2003"
    "9";"srv9";"systeme";"linux"
    "10";"srv10";"database";"windows 2000"
    Pour le parcourir je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $Monfichiercsv = "export.csv"
    $fh    = fopen($Monfichiercsv, 'r');
    fgetcsv($fh, 1024, ';', '"');
    while (($row = fgetcsv($fh, 1024, ';', '"')) !== false)
    {
            //$Montest[$row[2]] = $row; //Test non utilisé
    	$Montableau[] = $row; //Je mets chaque ligne dans un tableau
     
    }
    fclose($fh);
    Ensuite je veux chercher tous les serveurs qui sont sous la responsabilité de l'équipe "systeme" par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $responsable = "systeme"; \\Par la suite ce sera un choix dans une liste déroulante.
     
    $colonnes_afficher = array("1","2","3"); \\Par la suite ce sera des checkbox.
     
    foreach($Montableau as $champs => $details)
    {
    	If ($champs == $responsable)
    	{
    		echo $details[1].$details[2].$details[3]"</br>";//Je selectionne ici mes détails/colonnes à afficher.
    	}
    }
    Mon but est donc d'afficher les serveurs pour un responsable donné ex:systeme et d'afficher les colonnes que je souhaites.

    Par exemple, je souhaite connaitre tous les serveurs qui sont sous la responsabilité de l'équipe "systeme" et afficher le nom du serveur(1), l'équipe responsable(2) et son OS(3).

    Le code ci-dessous marchote, mais je ne trouve pas très bien, comment faire pour l'optimiser.

    Comment faire pour inclure $colonnes_afficher dans ma boucle foreach car ça me crée des doublons ...

    Le but est ainsi de pouvoir parcourir le csv comme je veux.

    Ex, si je veux sortir tous les serveurs qui ont comme OS Windows 2003, etc comment faire.

    Merci d'avance pour votre aide encore une fois.

    Bonne soirée.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne comprend pas trop ce que tu nous décris : ton code actuel ne peut pas fonctionner du tout car tu compares la clef $champs (0, 1, 2, 3 ...) avec la chaine "système"

    En restant sur ce que tu fais déjà, lire le CSV à chaque fois, tu n'as pas besoin de 2 traitements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    $Monfichiercsv = "export.csv"
    $fh    = fopen($Monfichiercsv, 'r');
    fgetcsv($fh, 1024, ';', '"');
    $colonnes_afficher = array(1,2,3);
    echo '<table>';
    while (($row = fgetcsv($fh, 1024, ';', '"')) !== false)
    {
            If ($row[3] == $responsable)
    	{
             echo '<tr>';
               foreach($colonnes_afficher as $col) {
                   echo '<td>' . $row[$col] . '</td>';
    	}
             echo '</tr>';
    }
    echo '</table>';
    fclose($fh);
    Il est par contre plus souple et plus efficace de stocker les données du CSV dans une base de données.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Bonjour Vincent alias sabotage

    C'est toujours les mêmes qu l'on retrouve c'est cool

    Effectivement dans le code erreur de recopie du code que j'ai voulu faire de tête désolé.

    Mon but n'est pas de faire de l'affichage direct, mais de mettre tout mon CSV dans un tableau que je pourrais réutiliser par la suite et afficher les colonnes souhaitées.

    Le vrai code donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    // Lecture du CSV et enregistrement dans un tableau
     
    $choice = 2; //Le responsable se trouve en col2 dans mon CSV.
    $asset = array();
    $fh    = fopen($Monfichiercsv, 'r');
    fgetcsv($fh, 1024, ';', '"'); // saut de l'en-tête
    while (($row = fgetcsv($fh, 1024, ';', '"')) !== false)
    {
        // les champs vides de la colonne sélectionnée sont ignorés
        if ( ! empty($row[$choice]))
        {
    	//echo $row[$choice]."</br>";
            $asset[$row[$choice]] = $row;
        }
    }
    fclose($fh);
     
    if (isset($_POST['bt_search']))
    {
     
        $SelectedTeam = "systeme"; //Je veux afficher tous les srv appartenant à "systeme".
     
         foreach ($asset as $server_id => $details)
         {
     
    	If ($SelectedTeam == $server_id)
    	{
    		echo $server_id." --> ".$SelectedTeam."-->".$details[26]."</br>";
    	}
          }
    }
    Le code marche mais ça ne m'affiche qu’une seule ligne :

    "7";"srv7";"systeme";"linux"

    Alors que d'autres serveurs au dessus appartiennent à cette équipe ...

    Bref je suis nul

    Merci d'avance.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Mon code ne fonctionne pas ?

    dans un tableau que je pourrais réutiliser par la suite
    C'est quoi "par la suite" ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Merci encore Vincent, c'est plus compliqué que ca en fait, c'est pour que je parle de traitement ultérieur et de mise dans un tableau.

    J'ai 2 fichiers à parcourir en fait. Le seul élément en commun dans les 2 fichiers est le nom du serveur.
    EXPORT.csv
    "id";"serveur";"responsable";"os"
    "1";"srv1";"systeme";"windows 2003"
    "2";"srv2";"reseaux";"windows 2003"
    "3";"srv3";"dadabase";"linux"
    "4";"srv4";"appli";"windows 2008"
    "5";"srv5";"appli";"linux"
    "6";"srv6";"systeme";"windows 2008"
    "7";"srv7";"systeme";"linux"
    "8";"srv8";"reseaux";"windows 2003"
    "9";"srv9";"systeme";"linux"
    "10";"srv10";"database";"windows 2000"
    VM.csv
    "id";"VMName";"Host";"IP"
    "A";"srv1";"ESX1";"192.168.0.1"
    "B";"srv2";"ESX2";"192.168.0.5"
    "C";"srv3";"ESX2";"192.168.0.12"
    "D";"srv4";"ESX3";"192.168.0.8"
    "E";"srv5";"ESX1";"192.168.0.16"
    "F";"srv6";"ESX4";"192.168.0.22"
    "G";"srv7";"ESX1";"192.168.0.16"
    "H";"srv8";"ESX1";"192.168.0.85"
    "I";"srv9";"ESX2";"192.168.0.3"
    "J";"srv10";"ESX3";"192.168.0.51"
    Ce que je souhaite faire :

    J'ai une liste déroulante d'équipes.
    (Pour le test ce sera $responsable = "systeme"

    Des checkbox correspondantes aux colonnes que je souhaite afficher.
    $colonnes_afficher_fichier_export = array("1","2","3");
    $colonnes_afficher_fichier_VM = array("1","2","3");

    Quand je sélectionne l'équipe "systeme".

    Je souhaite savoir pour l'équipe système quels sont les serveurs associés Fichier --> EXPORT.csv.

    Enusuite il y aura donc une autre boucle intégrée pour aller chercher dans le deuxieme Fichier --> VM.csv les infos correspondantes aux serveurs appartenant à l'équipe "systeme".

    Je souhaiterais donc sortir dans un tableau html du type :

    "serveur";"responsable";"os";"VMName";"Host";"IP"
    "srv1";"systeme";"windows 2003";"srv1";"ESX1";"192.168.0.1"
    "srv6";"systeme";"windows 2008";"srv6";"ESX4";"192.168.0.22"
    "srv7";"systeme";"linux";"srv7";"ESX1";"192.168.0.16"
    "srv9";"systeme";"linux";"srv9";"ESX2";"192.168.0.3"
    C'est pour faire un code le plus modulable possible en fait mais c'est galère.

    Merci beaucoup encore.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut juste du calme et de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    $colonnes_afficher_fichier_export = array(3);
    $colonnes_afficher_fichier_VM = array(1,2,3); 
    $responsable = "systeme"
     
    $fh    = fopen('export.csv', 'r');
    while (($row = fgetcsv($fh, 1024, ';', '"')) !== false) {
            If ($row[3] == $responsable) {
                     $tblServeur[$row[2]] = $row;
            }
    }
    fclose($fh);
     
     
    if (isset($tblServeur)) {
    $fh = fopen('VM.csv', 'r');
    while (($row = fgetcsv($fh, 1024, ';', '"')) !== false) {
            $display = array();
            If (isset($tblServeur[$row[1]]) {
                     foreach ($colonnes_afficher_fichier_export as $col) {
                            $display[] = $tblServeur[$row[1]][$col]
                     }
                      foreach ($colonnes_afficher_fichier_VM as $col) {
                            $display[] = $row[$col];
                     }
                     echo implode(';', $display);
            }
    }
    fclose($fh);
    Mais comme je t'ai dit, la base de donnée est faite pour ça.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Merci beaucoup Vincent c'est exactement ca !

    Ça fonctionne comme je le souhaite.

    Pas de BDD car je n'ai pas le temps et pcq c'est juste des extracts générés chaque jours dans des fichiers à plat.

    En tous cas merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Charger un Fichier CSV avec traitement
    Par Iphelias dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 06/08/2007, 13h53
  2. Réponses: 2
    Dernier message: 13/03/2007, 11h19
  3. Update fichier CSV avec ADO et Windev
    Par bastiencb dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 13/12/2006, 16h27
  4. [CSV] Affichage d'un fichier csv avec pagination
    Par arnoweb dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2006, 15h13
  5. Comment parcourir un fichier texte avec une boucle ?
    Par kikica dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2005, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo