Discussion:
Recherche sur un tableau CSV a 2 dimensions
(trop ancien pour répondre)
P. Clavier
2007-12-07 20:08:23 UTC
Permalink
Bonjour,

J'ai un tableau à 2 dimensions en CSV (format Excel), qui represente un
tableau de garde, et est compose comme suit

07/12/2007, 8h, paul, 12h, pierre, 17h, jean, 22h
08/12/2007, 09h, jean, 15h, pierre, 20h, louis, 23h, andre, 04h
etc ...

Connaissant le nom, je souhaite pouvoir afficher chaque garde sous la
forme:

pour pierre, par exemple:

07/12/2007 12h - 17h
08/12/2007 15h - 20h

J'ai fait ce petit code en m'inspirant du VB, en indiçeant, mais celà ne
marche pas.

<?php
$nom_fichier = '3.csv';
$id = fopen($nom_fichier,'r');
$nom = "pierre";
while ($array []= fgetcsv($id,1024,";"));
$heigt = sizeof ($array);
$width = 50;
for ($i=0; $i < $heigt ; $i ++);
{ for ($j = 0; $j < $width; $j ++);
if ($array [$i][$j] == $nom);
echo $array [$i-1][$i][$j+1];
}
?>


Je vous remercie de me donner un petit coup de main.

Sympathie

Patrick
Olivier Miakinen
2007-12-07 20:43:47 UTC
Permalink
Bonjour,
Post by P. Clavier
J'ai un tableau à 2 dimensions en CSV (format Excel), qui represente un
tableau de garde, et est compose comme suit
07/12/2007, 8h, paul, 12h, pierre, 17h, jean, 22h
08/12/2007, 09h, jean, 15h, pierre, 20h, louis, 23h, andre, 04h
etc ...
Connaissant le nom, je souhaite pouvoir afficher chaque garde sous la
07/12/2007 12h - 17h
08/12/2007 15h - 20h
D'accord.
Post by P. Clavier
J'ai fait ce petit code en m'inspirant du VB, en indiçeant, mais celà ne
marche pas.
<?php
$nom_fichier = '3.csv';
$id = fopen($nom_fichier,'r');
$nom = "pierre";
while ($array []= fgetcsv($id,1024,";"));
Je ne connaissais pas cette fonction fgetcsv() qui a l'air bien sympa.
Mais j'ai trois remarques :

1) Au début tu donnes un exemple dans lequel les données sont séparées
par les deux caractères ", " puis tu appelles cette fonction avec ";"
comme délimiteur. Note que la fonction ne supporte pas d'avoir plusieurs
caractères pour délimiteur : si jamais c'est ce que tu as, il y a moyen
de s'en sortir quand même, mais il faudra faire autrement.

2) Il ne devrait pas y avoir de problème puisque tes données commencent
toutes par un nombre non nul, mais en principe il faudrait tester que le
code de retour est « !== FALSE » et pas seulement qu'il est non nul.

3) Il ne faut quand même pas mettre le FALSE de la fin dans $array[].
Post by P. Clavier
$heigt = sizeof ($array);
$width = 50;
Non. $width est variable, pas fixe.
Post by P. Clavier
for ($i=0; $i < $heigt ; $i ++);
Supprimer le « ; » final !
Post by P. Clavier
{ for ($j = 0; $j < $width; $j ++);
$width = count($array[$i]);
for ($j = 2; $j < $width - 1; $j++)

Sans « ; » bien sûr.
Post by P. Clavier
if ($array [$i][$j] == $nom);
Pas de « ; » non plus.
Post by P. Clavier
echo $array [$i-1][$i][$j+1];
Là, ce serait plutôt quelque chose comme :
echo $array[$i][0] . ' '
. $array[$i][$j-1] . ' - '
. $array[$i][$j+1];


Donc, en supposant que les données sont effectivement séparées par ";"
et pas par ", " :

<?php
$nom_fichier = '3.csv';
$id = fopen($nom_fichier,'r');
$nom = "pierre";

while (($subarray = fgetcsv($id, 1024, ";")) !== NULL) {
$array[]= $subarray;
}

$heigt = count($array);
for ($i = 0; $i < $heigt ; $i++) {
$width = count($array[$i]);
for ($j = 2; $j < $width - 1; $j++) {
if ($array[$i][$j] == $nom) {
echo $array[$i][0] . ' '
. $array[$i][$j-1] . ' - '
. $array[$i][$j+1];
}
}
}
?>

Non testé, mais ça a quand même plus de chances de fonctionner.
Olivier Miakinen
2007-12-07 21:40:43 UTC
Permalink
Post by Olivier Miakinen
for ($j = 2; $j < $width - 1; $j++) {
Une petite optimisation :
for ($j = 2; $j < $width - 1; $j += 2) {
Olivier Miakinen
2007-12-08 07:48:01 UTC
Permalink
Post by Olivier Miakinen
for ($j = 2; $j < $width - 1; $j += 2) {
Par ailleurs, si le fichier n'est lu que pour un seul nom, inutile de
passer par un tableau de tableaux.

<?php
$nom_fichier = '3.csv';
$id = fopen($nom_fichier,'r');
$nom = "pierre";

while (($ligne = fgetcsv($id, 1024, ";")) !== NULL) {
for ($j = 2; $j < count($ligne) - 1; $j++) {
if ($ligne[$j] == $nom) {
echo $ligne[0] . ' ' . $ligne[$j-1] . ' - ' . $ligne[$j+1];
}
}
}
?>
esculape2002fr
2007-12-08 12:15:16 UTC
Permalink
Post by Olivier Miakinen
Post by Olivier Miakinen
for ($j = 2; $j < $width - 1; $j += 2) {
Par ailleurs, si le fichier n'est lu que pour un seul nom, inutile de
passer par un tableau de tableaux.
<?php
$nom_fichier = '3.csv';
$id = fopen($nom_fichier,'r');
$nom = "pierre";
while (($ligne = fgetcsv($id, 1024, ";")) !== NULL) {
for ($j = 2; $j < count($ligne) - 1; $j++) {
if ($ligne[$j] == $nom) {
echo $ligne[0] . ' ' . $ligne[$j-1] . ' - ' . $ligne[$j+1];
}
}
}
?>
Merci à tous. C'est OK, mais, après la ligne de résultats, j'obtiens le
message suvant:

Fatal error: Maximum execution time of 30 seconds exceeded in e:\program
files\easyphp1-8\www\csv.php on line 6

Quelqu'un aurait-il une idée pour y remedier ?

Merci encore !

Patrick
Olivier Miakinen
2007-12-08 12:19:21 UTC
Permalink
Post by esculape2002fr
Post by Olivier Miakinen
[...]
while (($ligne = fgetcsv($id, 1024, ";")) !== NULL) {
[...]
Merci à tous. C'est OK, mais, après la ligne de résultats, j'obtiens le
Fatal error: Maximum execution time of 30 seconds exceeded in e:\program
files\easyphp1-8\www\csv.php on line 6
Quelqu'un aurait-il une idée pour y remedier ?
Il suffit de corriger la coquille : j'avais écrit en lisant la doc qu'on
devait comparer le résultat à FALSE, or j'ai écrit NULL à la place dans
mon code complet...

while (($ligne = fgetcsv($id, 1024, ";")) !== FALSE) {

Continuer la lecture sur narkive:
Loading...