Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Recherche sur un tableau CSV a 2 dimensions

5 réponses
Avatar
P. Clavier
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

5 réponses

Avatar
Olivier Miakinen
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


D'accord.

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[].

$heigt = sizeof ($array);
$width = 50;


Non. $width est variable, pas fixe.

for ($i=0; $i < $heigt ; $i ++);


Supprimer le « ; » final !

{ for ($j = 0; $j < $width; $j ++);


$width = count($array[$i]);
for ($j = 2; $j < $width - 1; $j++)

Sans « ; » bien sûr.

if ($array [$i][$j] == $nom);


Pas de « ; » non plus.

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.

Avatar
Olivier Miakinen
Le 07/12/2007 21:43, je répondais à P. Clavier :

for ($j = 2; $j < $width - 1; $j++) {


Une petite optimisation :
for ($j = 2; $j < $width - 1; $j += 2) {

Avatar
Olivier Miakinen

Une petite optimisation :
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];
}
}
}
?>

Avatar
esculape2002fr
Olivier Miakinen <om+ écrivait news:475a4bd5$1
@neottia.net:


Une petite optimisation :
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
fileseasyphp1-8wwwcsv.php on line 6

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

Merci encore !

Patrick


Avatar
Olivier Miakinen

[...]
while (($ligne = fgetcsv($id, 1024, ";")) !== NULL) {
[...]


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
fileseasyphp1-8wwwcsv.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) {