tri csv

Petit nouveau ! | 1 Messages

03 nov. 2010, 21:28

Bonjour à tous.
Débutant en PHP, j'utilise le script suivant pour afficher "fichier.csv" dans un tableau html.
"fichier.csv" est sous la forme : NOM Prénom;Club;Licence;Age
Comment dois-je modifier le script pour qu'il affiche "fichier.csv" trié par ordre alphabétique par "NOM Prénom" ?


<?php
echo "<table width=65% border=0 align=center cellpadding=3 cellspacing=1 bgcolor=#3366FF>";
echo "<colgroup></colgroup><colgroup align=left></colgroup>";
$row = 0;
$fichier = fopen("fichier.csv", "r");
while (($data = fgetcsv($fichier, 1000, ";")) !== FALSE) {

$num = count($data);
echo "<tr>";
$row++;
for ($c=0; $c < $num; $c++) {
echo "<td>" . $data[$c] . "</td>";
}
echo "</tr>";
}
fclose($fichier);
echo "</table>";
?>
Merci d'avance

ViPHP
AB
ViPHP | 5818 Messages

03 nov. 2010, 22:17

A priori avec ton fichier csv j'essaierais de faire avec les champs récupérées
un tableau à deux dimensions de cette forme ;

Pour chaque ligne :

$tab[$valeur_nom_prenom]['club'] = $valeur_club;
$tab[$valeur_nom_prenom]['licence'] = $valeur_licence;
$tab[$valeur_nom_prenom]['Age'] = $valeur_age;


Ensuite tu fais ksort($tab) qui tri le tableau sur les clé (donc sur $valeur_nom_prenom) et voilà. Reste plus qu'à afficher ton tableau.

Y'a peut-être plus simple mais en attendant cette solution devrait fonctionner :wink:

ViPHP
AB
ViPHP | 5818 Messages

03 nov. 2010, 22:52

Donc ça pourrait donner quelque chose comme ça :
$tab = array();

$fichier = fopen("fichier.csv", "r");
while (($data = fgetcsv($fichier, 1000, ";")) !== FALSE) 

{
	$tab[$data[0]]['club'] = $data[1];
	$tab[$data[0]]['licence'] = $data[2];
	$tab[$data[0]]['age'] = $data[3];
}

fclose($fichier);

ksort($tab);

foreach ($tab as $key => $value) echo $key.' '.$value['club'].' '.$value['licence'].' '.$value['age'].'<br />';
Pas testé mais on devrait pas être loin du compte.

hindio
Invité n'ayant pas de compte PHPfrance

04 nov. 2010, 11:40

merci AB
C'est presque ce que je voulais.
Il me manque juste de savoir ou placer les balises <table> <tr> et <td> pour l'affichage sous forme de tableau.

ViPHP
ViPHP | 5462 Messages

04 nov. 2010, 14:35

ce que tu peux faire aussi, c'est importer ton fichier dans un base sqlite en memoire tu pourras faire des requete comme tu le souhaite dessus, la ca va etre uniquement trier par Nom mais pas par prénom apres

ViPHP
AB
ViPHP | 5818 Messages

04 nov. 2010, 16:37

Tu peux créer le code html avec une table comme ceci :
<?php
$tab = array();

$fichier = fopen("fichier.csv", "r");
while (($data = fgetcsv($fichier, 1000, ";")) !== FALSE)

{
        $tab[$data[0]]['club'] = $data[1];
        $tab[$data[0]]['licence'] = $data[2];
        $tab[$data[0]]['age'] = $data[3];
}

fclose($fichier);

ksort($tab);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
</head>

<body>

<?php if(isset($tab) && is_array($tab) && count($tab) > 0)
{
echo '<table>';

foreach ($tab as $key => $value) 
{
echo '<tr>';
echo '<td>'.$key.'</td><td>'.$value['club'].'</td><td>'.$value['licence'].'</td><td>'.$value['age'].'</td>';
echo '</tr>';
}

echo '</table>';
}
 ?>
</body>
</html>
Modifié en dernier par AB le 04 nov. 2010, 18:08, modifié 2 fois.

ViPHP
ViPHP | 5462 Messages

04 nov. 2010, 16:41

AB : tu devrais regarder SplFileObject, tu peux manipuler du CSV mais avec les Iterators :wink:

ViPHP
AB
ViPHP | 5818 Messages

04 nov. 2010, 16:53

Je prend note, mais bon quand j'utilise des nouveaux trucs, faut que j'y vois un intérêt assez rapide, or là le code de base est trop simple pour que je puisse trouver ta solution encore plus simple... Peut-être dans d'autres circonstances :)

Cela dit si tu veux donner ta version, ça fera une variante php5 :)

ViPHP
ViPHP | 5462 Messages

04 nov. 2010, 16:57

Je prend note, mais bon quand j'utilise des nouveaux trucs, faut que j'y vois un intérêt assez rapide, or là le code de base est trop simple pour que je puisse trouver ta solution encore plus simple... Peut-être dans d'autres circonstances :)

Cela dit si tu veux donner ta version, ça fera une variante php5 :)

ca ferait comme ca
$fichier = new SplFileObject("fichier.csv");
$fichier->setFlags(SplFileObject::READ_CSV);

foreach($fichier as $data)
{
    $tab[$data[0]]['club'] = $data[1];
    $tab[$data[0]]['licence'] = $data[2];
    $tab[$data[0]]['age'] = $data[3];
}
tu gagnes du temps sur le parcours (iterator quoi) :wink:

ViPHP
AB
ViPHP | 5818 Messages

04 nov. 2010, 18:05

A ben voilà, c'est tout de suite plus motivant avec un exemple, merci :wink:

Et comme ça a piqué un peu plus ma curiosité j'y ai regardé un peu mieux :)

D'ailleurs si j'ai bien compris il faudrait utiliser la fonction setCsv pour indiquer le format français comme dans l'exemple original, donc la partie php deviendrait ça :
$fichier = new SplFileObject("fichier.csv");
$fichier->setFlags(SplFileObject::READ_CSV);
$fichier->setCsvControl(';');

$tab = array();

foreach($fichier as $data)
{
    $tab[$data[0]]['club'] = $data[1];
    $tab[$data[0]]['licence'] = $data[2];
    $tab[$data[0]]['age'] = $data[3];
}

ksort($tab);