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 :

Fusion de csv


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut Fusion de csv
    Bonjour à tous
    Grâce au script suivant, je parviens à afficher le contenu de 2 csv dans un seul tableau html.
    Déjà bien pour mes maigres compétences!!!
    Mais en fait, je voudrais pouvoir fusionner les 2 csv pour les afficher triés.

    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
    <?php 
    $CLTP1 = "CLTP1.csv"; 
    $p1 = fopen($CLTP1, 'rb');
    $CLTP2 = "CLTP2.csv"; 
    $p2 = fopen($CLTP2, 'rb');  
     
     echo "<table border=1>"; 
     
    for ($ligne = fgetcsv($p1, 1024, ","); !feof($p1); $ligne = fgetcsv($p1, 1024, ",")) {
     array_pop($ligne); 
      echo '<tr>';
      $j = sizeof($ligne);
      for ($i = 0; $i < $j; $i++) {
        echo "<td>$ligne[$i]</td>";
        }
      echo "</tr>";
      }				  
     
     for ($ligne = fgetcsv($p2, 1024, ","); !feof($p2); $ligne = fgetcsv($p2, 1024, ",")) {	 
     array_pop($ligne);
      echo '<tr>';
      $j = sizeof($ligne);
      for ($i = 0; $i < $j; $i++) {
        echo "<td>$ligne[$i]</td>";
        }
      echo "</tr>";
      }		
     
    echo "</table>\n";
     ?>

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    fusionner mais comment ?

    ps : c'est pas sizeof mais count, et pour parcourir un array c'est pas for mais foreach

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Si je comprends bien, tu veux afficher le contenu, fusionné et trié sur un certain paramètre, de tes deux fichiers CSV dans un tableau HTML.
    Bêtement, j'aurais tendance à mettre le contenu des deux fichiers dans un gros array php et faire un sort (ou un usort) dessus.

    Pour compléter le ps de stealth35, pour parcourir le fichier j'utiliserai plutôt while($ligne = fgetcsv($p1, 1024, ",")) et foreach pour lire les éléments de la ligne.

    @stealth35 : sizeof est un alias de count, donc logiquement ça doit fonctionner aussi (cela dit, moi aussi je préfère utiliser count)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    Oui Celira, tu as parfaitement compris mon problème.
    Mais vu mes faibles connaissances en PHP, je ne sais pas comment m'y prendre....

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut

    Comment ajouter un élément à un tableau ?
    Comment trier un tableau multidimensionnel sur ses deuxième et troisième colonnes ?
    et
    PHP : Le tutoriel pour grands débutants pressés

    L'idée c'est :
    1. créer un array vide $fusion
    2. parcourir le premier fichier (avec while et fgetcsv) et mettre chaque ligne dans $fusion
    3. parcourir le second fichier (avec while et fgetcsv) et mettre chaque ligne dans $fusion
    4. trier $fusion avec une fonction de tri
    5. parcourir $fusion (avec foreach) et afficher les lignes
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    Merci Celira pour ton plan de travail.
    Voici une première approche, qui bien sûr ne fonctionne pas....
    Pardon pour la non-coloration du code, mais les boutons sont désactivés
    Dur, dur le PHP à 60 ans !!!

    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
     
    <?php
    $fusion = array("licence", "nom", "prénom"); // tableau vide
     
     // traitement du 1er csv
    	$CLTP1 = "CLTP1.csv"; 
    	$p1 = fopen($CLTP1, 'rb'); 
    	while (($ligne = fgetcsv($p1, 1000, ",")) !== FALSE) {
     	array_push($fusion, $ligne);
     	}
     
     // traitement du 2ème csv
     	$CLTP2 = "CLTP2.csv"; 
    	$p2 = fopen($CLTP2, 'rb'); 
    	while (($ligne = fgetcsv($p2, 1000, ",")) !== FALSE) {
     	array_push($fusion, $ligne);
     	}
     
     // lecture simple de la fusion des 2 csv
      	foreach($fusion as $ligne)   {     
       	echo $ligne ,'<br/>';  }
     
    ?>

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    il faut faire un array_multisort pour faire le tri,

    ps : plutôt faire : $fusion[] = $ligne que array_push($fusion, $ligne);

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Ton tableau de départ n'est pas vraiment vide
    Et on ne peut pas faire un echo d'un tableau. Donc soit tu utilises print_ r (juste pour voir ce qu'il ya dedans), soit tu reprends l'affichage en tableau html que tu utilisais dans ton 1er script.

    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
    <?php
    $fusion = array(); // tableau vide
     
    // traitement du 1er csv
    $CLTP1 = "CLTP1.csv"; 
    $p1 = fopen($CLTP1, 'rb'); 
    while (($ligne = fgetcsv($p1, 1000, ",")) !== FALSE) {
     	$fusion[] = $ligne;
    }
     
    // traitement du 2ème csv
    $CLTP2 = "CLTP2.csv"; 
    $p2 = fopen($CLTP2, 'rb'); 
    while (($ligne = fgetcsv($p2, 1000, ",")) !== FALSE) {
     	$fusion[] = $ligne;
    }
     
    //ici ajouter le tri
     
    // lecture en table html de la fusion des 2 csv
    echo '<table>'; //début du tableau html
    foreach($fusion as $ligne)   {
    	echo '<tr>'; //début de la ligne 
    	foreach ($ligne as $elt) {
    		echo '<td>'.$elt.'</td>'; // une cas de la ligne
    	}
    	echo '</tr>'; //fin de la ligne
    }
    echo '</table>'; //fin du tableau html
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    Merci Celira, ça prend forme.
    Il me reste à effectuer le tri.
    J'ai essayé :

    sort($fusion);

    Mais le tri s'effectue sur la colonne 1 et je souhaite le faire sur une autre colonne.
    Peut-être avec array_multisort, mais la syntaxe me dépasse.

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Il faut que tu écrives une fonction qui fasse la comparaison entre 2 lignes, puis que tu utilises cette fonction comme fonction de tri. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // fonction de tri croissant sur la 2e colonne du tableau
    function trierSurColonne2($tab1, $tab2) {
      // on compare la 2e colonne des 2 tableaux en entrée
      return strcmp($tab1[1], $tab2[1]);
    }
     
    usort($fusion, 'trierSurColonne2');
    Evidemment, tu peux mettre ce qui t'arrange dans la fonction de tri.
    strcmp et usort
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    Impec Celira
    Une dernière (?) précision : lors de l'affichage en tableau de $fusion, je souhaiterais n'afficher que certaines colonnes.
    Lors du traitement habituel de l'affichage d'un csv, j'utilise :

    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
    <?php 
    echo "<table>"; 
    $fichier = "monfichier.csv"; 
    $fic = fopen($fichier, 'rb'); 
    $tab_colonnes=array(1,3,7); //colonnes à afficher
    for ($ligne = fgetcsv($fic, 1024, ","); !feof($fic); $ligne = fgetcsv($fic, 1024, ",")) { 
    		echo "<tr>"; 
    		$j = sizeof($ligne); 
    		for ($i = 0; $i < $j; $i++) { 
    			if(in_array($i,$tab_colonnes)){
    				echo "<td>".$ligne[$i]."</td>"; 
    			}
    		} 
    		echo "</tr>"; 
    } 
    echo "</table>\n"; 
    ?>
    Je ne parviens pas à intégrer cette fonction dans mon cas.

  12. #12
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    l'instruction foreach ($tab as $i => $val) est équivalente à for ($i = 0; $i < sizeof($tab); $i++) avec $val qui vaut $tab[$i]

    Donc ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $j = sizeof($ligne); 
    for ($i = 0; $i < $j; $i++) { 
    	if(in_array($i,$tab_colonnes)){
    		echo "<td>".$ligne[$i]."</td>"; 
    	}
    }
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ($ligne as $i => $elt) {
    	if(in_array($i,$tab_colonnes)) {
    		echo '<td>'.$elt.'</td>'; // une cas de la ligne
    	}
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    merci Celira, mais c'est décidément compliqué le PHP... En plus, on peut faire la même chose de différentes manières !!!
    Grâce à toi, j'ai pratiquement terminé mon module.
    J'ai rajouté quelques array_pop($fusion), j'ai modifié la fonction tri : celle que tu m'avais proposée effectuait une comparaison binaire et non numérique.
    J'ai donc utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function cmpclass($a, $b) {
    		if ($a[8] == $b[8]) {
    			return 0;
    		}
    		return ($a[8] > $b[8]) ? -1 : 1;
    	}

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    ...C'est jamais vraiment terminé : je voudrais pouvoir ajouter une colonne avant les autres lors de l'affichage de mon tableau $fusion.
    elle contiendrait
    1
    2
    3
    ....
    251
    252
    jusqu'au nb max lignes de $fusion

    Est-ce réalisable ?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    comment faire une incrementation pour remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $fusion[1][0] = "1";
    $fusion[2][0] = "2";
    $fusion[3][0] = "3";
    $fusion[4][0] = "4";
    $fusion[5][0] = "5";
    $fusion[6][0] = "6";
    $fusion[7][0] = "7";
    $fusion[8][0] = "8";
    $fusion[9][0] = "9";
    $fusion[10][0] = "10";
    ....
    jusqu'à count($fusion)

  16. #16
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Tu places un compteur à l'extérieur de la boucle sur les lignes que tu incrémentes à l'intérieur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // lecture en table html de la fusion des 2 csv
    echo '<table>'; //début du tableau html
    $compteur = 1;
    foreach($fusion as $ligne)   {
    	echo '<tr>'; //début de la ligne 
    echo '<td>'.$compteur.'</td>'; //colonne du compteur
    	foreach ($ligne as $elt) {
    		echo '<td>'.$elt.'</td>'; // une cas de la ligne
    	}
    	echo '</tr>'; //fin de la ligne
    $compteur++;//on incremente le compteur
    }
    echo '</table>'; //fin du tableau html
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

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

Discussions similaires

  1. Fusion Fichiers CSV
    Par Geoffroy123 dans le forum Visual C++
    Réponses: 2
    Dernier message: 26/02/2010, 15h19
  2. Fusion de fichier csv
    Par malox dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 26/05/2008, 12h19
  3. Fusion de fichiers .csv et comparaison avec fichier .xls
    Par GourenBZH dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/04/2008, 14h15
  4. [CSV] Ajout/fusion de valeurs de fichiers csv
    Par dcanl dans le forum Langage
    Réponses: 2
    Dernier message: 24/01/2007, 09h51

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