PHP ET CSV

scrab88
Invité n'ayant pas de compte PHPfrance

15 sept. 2011, 12:29

Bonjour à tous

J'utilise souvent les fonctions csv de php pour afficher des tableaux en html.
Existe-t-il une fonction php pour combiner plusieurs csv de structure identique et les afficher dans un seul tableau trié ?

Merci pour vos réponses.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 sept. 2011, 14:03

salut,

an natif non.

Après avec des structures identiques on peu imaginer un code simple.

la fonction file te permet d'avoir un tableau avec une ligne du fichier par "case" du tableau.
s'il y a une ligne "d’entête" il faut la virer sauf pour le premier fichier. et tu utilise array_merge pour n'avoir qu'un seul tableau avec le contenu de tout les fichiers que tu peux afficher a la fin.

exemple
<?php
$tableaufichier = array ('fichier1.csv','fichier2.csv'); // c'est pour l'exemple ça peut tres bien être le retour d'un formulaire d'upload par exemple
$tableaucsv = array();
foreach ($tableaufichier as $fichiercsv) {
	// on met le contenu du fichier dans une variable temporaire
	$tmp = file($fichiercsv);
	// on vérifie si le tableaucsv est vide car s'il ne l'est pas on vire la 1ere ligne (en considérant qu'il y a TOUJOURS une ligne d'entête,
	// sinon ben faut virer le test XD
	if (!empty($tableaucsv)) {
		unset ($tmp[0]);
	}
	$tableaucsv = array_merge($tableaucsv,$tmp)
}

// affichage final
foreach ($tableaucsv as $csv) {
	// ton traitement habituel
}
?>
bon a près on peu imagine plein de truc, par exemple utiliser un tableau de tableau pour mettre le nom du fichier pour séparer les donnée histoire d'en connaitre la source
genre $tableaucsv[] = array('nomfichier'=>$fichiercsv, 'data' => $tmp);

dans ce cas l'affichage aura un double foreach
<?php
foreach ($tableaucsv as $file) {
	echo 'fichier : '.$file['nomfichier'].'<br />';
	foreach ($file['data'] as $csv) {
		//traitement habituel
	}
}
?>
tu peux aussi construire une classe autour de cela pour "masquer" la "tonne" de code ;)


@+
Il en faut peu pour être heureux ......

scrab88
Invité n'ayant pas de compte PHPfrance

16 sept. 2011, 09:51

Merci Moogli
Je suis novice en PHP et je ne parviens pas à combiner tes lignes de code avec mon script d'affichage.
Ci-dessous, le script que j'utilise :
<?php 	 
$fichier = 'CLTP1.csv';	   
if(file_exists($fichier)) {
echo "<table>";  
echo "<colgroup></colgroup><colgroup align=left></colgroup><colgroup align=left></colgroup>";
$fic = fopen($fichier, 'rb'); 
$nb_lignes=0;		//Init du nombre de lignes
$nb_lignes_max=250; //Gestion des lignes dans un tableau
$tab_colonnes=array(0,2,3,4,5,6,8); //Gestion des colonnes dans un tableau
 
for ($ligne = fgetcsv($fic, 1024, ","); !feof($fic); $ligne = fgetcsv($fic, 1024, ",")) { 
	if($nb_lignes<$nb_lignes_max){
		echo "<tr>"; 
		$j = sizeof($ligne); 
		for ($i = 0; $i < $j; $i++) { 
			if(in_array($i,$tab_colonnes)){
				echo "<td>".$ligne[$i]."</td>"; 
			}
		} 
		echo "</tr>"; 
	}
	$nb_lignes++;
	
} 
echo "</table>\n";
} 	
else {
echo "Pas encore de résultat saisi... !";
}
?>

Mammouth du PHP | 2278 Messages

16 sept. 2011, 10:24

je mettrais un controle :
for ($ligne = fgetcsv($fic, 1024, ","); !feof($fic); $ligne = fgetcsv($fic, 1024, ",")) {
print_r($ligne);
...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 5462 Messages

16 sept. 2011, 10:34

un while suffit
while ($ligne = fgetcsv($fic))

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 sept. 2011, 11:28

Merci Moogli
Je suis novice en PHP et je ne parviens pas à combiner tes lignes de code avec mon script d'affichage.
Ci-dessous, le script que j'utilise :
je t'ai donnée quasiement tout, il te manque juste la fonction str_getcsv qui va faire la même chose que fgetcsv mais sur une chaine de caractère.

le code mis plus haut va te créer un tableau avec une ligne du fichier par 'case' du tableau et cela pour chaque tableau. Il te suffit donc de mettre ceci
<?php
echo "<tr>";
                $j = sizeof($ligne);
                for ($i = 0; $i < $j; $i++) {
                        if(in_array($i,$tab_colonnes)){
                                echo "<td>".$ligne[$i]."</td>";
                        }
                }
                echo "</tr>"; 
?>
dans la boucle foreach qui parcourt le tableau.

qu'est ce que tu n'a pas compris dans le code fournit ?

@+
Il en faut peu pour être heureux ......

scrab88
Invité n'ayant pas de compte PHPfrance

17 sept. 2011, 00:05

Décidément trop compliqué pour moi, tout ça....
Merci quand même.