Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/09/2011, 20h38   #1
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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 :
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";
 ?>
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 09h46   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
fusionner mais comment ?

ps : c'est pas sizeof mais count, et pour parcourir un array c'est pas for mais foreach
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 11h48   #3
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 661
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 661
Points : 5 388
Points : 5 388
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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 12h45   #4
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
Oui Celira, tu as parfaitement compris mon problème.
Mais vu mes faibles connaissances en PHP, je ne sais pas comment m'y prendre....
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 13h11   #5
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 661
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 661
Points : 5 388
Points : 5 388

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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h38   #6
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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 :
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/>';  }
 
?>
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h56   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
il faut faire un array_multisort pour faire le tri,

ps : plutôt faire : $fusion[] = $ligne que array_push($fusion, $ligne);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h01   #8
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 661
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 661
Points : 5 388
Points : 5 388
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 :
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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 11h06   #9
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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.
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 12h24   #10
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 661
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 661
Points : 5 388
Points : 5 388
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 :
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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 14h01   #11
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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 :
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.
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 10h26   #12
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 661
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 661
Points : 5 388
Points : 5 388
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 :
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 :
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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 12h35   #13
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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 :
1
2
3
4
5
6
function cmpclass($a, $b) {
		if ($a[8] == $b[8]) {
			return 0;
		}
		return ($a[8] > $b[8]) ? -1 : 1;
	}
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 12h40   #14
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
...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 ?
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 22h55   #15
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
comment faire une incrementation pour remplacer :

Code :
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)
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 09h49   #16
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 661
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 661
Points : 5 388
Points : 5 388
Tu places un compteur à l'extérieur de la boucle sur les lignes que tu incrémentes à l'intérieur.
Code :
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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h26.


 
 
 
 
Partenaires

Hébergement Web