Récupérer données fichier texte pour futures stats

Eléphant du PHP | 172 Messages

29 oct. 2005, 18:05

Salut !!!

Je suis un débutant qui est encore au prémice de l'apprentissage, et je souhaiterais avoir quelques renseignements à la difficulté de faire un "petit" programmes.

Le but sera de faire des stats simples sur des équipes de foot.(plus complexes si j'y arrive)

En premier lieu, j'ai un fichiers texte ou les résultats sont affichés sous cette forme :

1ère journée
retour à la ligne
equipe1(espace)score(sous la forme 0 - 0)(espace)equipe2.
etc...

chaques journées sont espacées de deux retour à la ligne.

J'aimerais avec un programme php, récupéré le numéro de la journée, le nom de l'equipe1, le score, le nom de l'equipe2, déterminer si c'est une victoire à l'extérieur, à domicile, ou un match nul, et le nombre de but marqués,(ce sera tout pour l'instant :-D) tout ceci en l'affichant dans un tableau html.

Ce qui me paraît pour l'instant difficile à faire, c'est de récupérer les données du fichier texte, est-ce possible ?

Car sinon, cela va me prendre beaucoup de temps pour mettre tout ça en manu dans un tableaux.

Et l'ensemble de ce que je désire obtenir est-il à portée d'un débutant ?

Merci de vos suggestion.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 oct. 2005, 18:16

Et l'ensemble de ce que je désire obtenir est-il à portée d'un débutant ?
Oui
commence déjà par faire un tour dans la documentation et regardes les fonctions de manipulation de fichiers

fonctionne par étape, commence par récupérer chaque rencontre pour pouvoir la traiter ensuite. Regarde dans la doc, tu as plusieurs façons de faire ça.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

29 oct. 2005, 18:19

SAlut, tout d'abord va falloir te renseigner sur les différentes fonctions associées aux fichier... fopen(), fgets() et un petit tuto ... voila rien de bien sorcier :lol:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 172 Messages

29 oct. 2005, 18:32

Merci ouckileou !!

Je vais regarder ça de plus près, mais à première vu cela me semble un petit peu hard :mrgreen:
un petit tuto ... voila rien de bien sorcier Laughing
Le site du zéro, je pensais pas qu'il aurait un truc de ce genre là-bas !!
J'va r'gardé ça.

Merci :wink:

Eléphant du PHP | 55 Messages

29 oct. 2005, 18:42

Et si t'es vraiment motivé, tu peux utiliser le REGEX, y'a rien de plus efficace pour faire du data-mining.
Mais qu'importe..

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

29 oct. 2005, 18:53

tu peux utiliser le REGEX
je n'osais pas le dire :?
pour un débutant c'est pas si facile :wink:
en plus simple (certes plus long) il y a substr() pour la récupération des valeurs ou encore explode() sur les espaces.

Mais bon on y est pas encore :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 oct. 2005, 19:14

Mais bon on y est pas encore :wink:
Absolument, en procédant étape par étape ça ira bien mieux...
Je vais regarder ça de plus près, mais à première vu cela me semble un petit peu hard :mrgreen:
Non ce n'est pas si compliqué, regarde les fonctions et tu trouvera celle-ci par exemple : file()
file -- Lit le fichier et renvoie le résultat dans un tableau
Exactement ce que tu voulais ;)

Invité
Invité n'ayant pas de compte PHPfrance

29 oct. 2005, 20:09

Bon voilà ce que j'ai fait, je n'ai pas encore eu trop de problème.
J'ai essayé la 1ère façon :
<?php
    
    $fichierFootD2 = 'resultatsD2.txt';
    
        if (file_exists($fichierFootD2)) 
        {
          $statfoot = fopen("resultatsD2.txt", "r");
          for ($ligne = 1; $ligne <= 3; $ligne++)
          {
          $ligne = fgets($statfoot);
          echo $ligne."<br />";
          }
          fclose($statfoot);
        } 
        else {
          echo "Erreur 10 (accès au fichier)";
        }
    
    ?>
Mais ayant un peu de mal avec les boucles, il y a un truc que je ne comprends pas, au lieu de m'afficher 3 lignes, il m'en affiche 30 :?
Pourquoi ?

Donc la seconde façon me conviendrait le mieux :
<?php

      // Lit le fichier resultatsD2.txt
      $lines = file ('resultatsD2.txt');

      // Affiche toutes les lignes du fichier, avec les numéros de ligne
      foreach ($lines as $line_num => $line) {
      echo htmlspecialchars($line) . '<br />'."\n";
      }
    
    ?> 
Mais maintenant que j'arrive à lire le fichier, ce que je souhaiterais, c'est récupérer comme je l'ai dis dans mon post initial la 1ère equipe, le score et la seconde, et là avec les espaces et saut de lignes, je ne vois pas trop comment faire, et c'est surtout ce que j'appréhende, car à mon avis ça va pas être facile.
Voici ce qui est affiché :

1ère journée

Amiens 3 - 0 Grenoble
Brest 0 - 0 Gueugnon
Châteauroux 1 - 1
Clermont 0 - 0 Sète
Créteil 3 - 2 Caen
Guingamp 1 - 1 Sedan
Laval 0 - 1 Istres
Montpellier 2 - 1 Le Havre
Reims 1 - 2 Lorient
Valenciennes 2 - 1 Dijon


2ème journée

Bastia 1 - 1 Créteil
Caen 3 - 0 Amiens
Dijon 1 - 1 Clermont
etc...


En plus, y'a une ville qui contient un espace dans son nom :mrgreen:
Vous parliez de REGEX, qu'est-ce que c'est ?
Ca peut me convenir ?

Merci.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 oct. 2005, 20:38

Ta première boucle n'est pas bonne car tu utilises comme compteur la variable $ligne, que tu modifies dès le premier passage en y affectant la première ligne du fichier...

Les REGEX, expressions régulières, servent à traiter des chaines de caractères, en utilisant des motifs. Du genre : "les lignes qui commencent par une lettre, suivant d'un ou plusieurs chiffres", tu crées comme ça des modèles et des fonctions permettent de les utiliser

Mais là, tu aurais plus simple que ça. Comment récupères-tu les résultats ? Est-ce que tu n'aurais pas moyen d'insérer un séparateur (ex : |) entre chaque composant (ville et score)
Ce serait beaucoup plus simple qu'une expression régulière, comme l'a dit Truc, d'autant plus si tu as des villes avec espaces

Invité
Invité n'ayant pas de compte PHPfrance

30 oct. 2005, 00:05

Ta première boucle n'est pas bonne car tu utilises comme compteur la variable $ligne, que tu modifies dès le premier passage en y affectant la première ligne du fichier...
Merci, j'ai compris mon erreur.

Bon, là j'ai vraiment eu beaucoup de mal à comprendre le explode :-k

Je pense avoir un peu avancé, mais j'aurais encore besoin d'un p'tit coup de main :mrgreen:

Voilà ce que j'ai fait :
<?php

$fichierFootD2 = 'resultatsD2.txt';
    
        if (file_exists($fichierFootD2)) 
        {
          $statfoot = fopen("resultatsD2.txt", "r");
          for ($compteur = 1; $compteur <= 12; $compteur++)
          {
          $ligne = fgets($statfoot);
          echo $ligne."<br />";
          }
          fclose($statfoot);
        } 
        else {
          echo "Erreur 10 (accès au fichier)";
        }

list($equipe1, $score, $equipe2) = explode("|", $ligne);

echo "<table style="width: 70%; margin: 0 auto; border: 2px solid #666666; text-align: center">
        <tr>
          <td>$equipe1</td>
          <td>$score</td>
          <td>$equipe2</td>
        </tr>
      </table>";

?>
Je souhaiterais récupérer dans mon tableau, les lignes qui affichent les résultats, sachant que les deux premières, et deux dernières lignes doivent être ignorées, je ne sais pas comment récupérer la ligne n°x à la ligne n°y
Encore une boucle ?

Ensuite je pense qu'il va falloir que j'utilises encore une autre boucle, puisque chaque journée de résultats représente 14 lignes, elle devra se répéter donc tout ces 14 lignes, et s'afficher ainsi dans mon tableau.

Pourriez vous m'aiguillez sur la façon dont je pourrait faire ça ?

:merci:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 oct. 2005, 02:18

je vois que tu as bien fait tes devoirs, deja tant de choses apprises depuis le 1er post :lol:

pour aller plus vite que ta boucle et etre sur de lire toutes les lignes du fichier je te propose ceci:
$match=array(); //tableau conteant toutes les données
$fichierFootD2 = 'resultatsD2.txt';
if (file_exists($fichierFootD2))
{
    $statfoot = fopen("resultatsD2.txt", "r");
    while ($ligne = fgets($statfoot)) 	//on boucle tant qu'il y a des lignes a lire dans le fichier
		$match[]=explode(" ",$ligne); // explode doit se faire sur l'espace puisque tu as des espaces dans ton fichier et non des |
    fclose($statfoot);
}
else 
{
    echo "Erreur 10 (accès au fichier)";
}

//accès rapide, pour exemple
echo $match[2][0]." ".$match[2][1]." - ".$match[2][3]." ".$match[2][4];
le dernier echo sert juste d'exemple, tu dois faire un boucle et lister le tableau avec foreach()
par exemple :wink:

par contre les lignes "blanches" sont également ajoutée au tableau, certainement a améliorer :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 oct. 2005, 13:38

// explode doit se faire sur l'espace puisque tu as des espaces dans ton fichier et non des |
Oui, j'avais demandé s'il n'y avait pas moyen de rajouter un séparateur unique, car il a précisé qu'il avait des espaces dans certains noms de villes, comment tu vas faire avec ta solution ?
Si tu fais ton explode sur un truc qui n'est pas toujours un séparateur, tu vas être bien embêté...

Et je croyais que la solution avec file() convenait mieux, pourquoi avoir changé ? ça aurait été simple pour récupérer les lignes sans les 2 premières et les 2 dernières, puisque tu aurais pu utiliser les indices de cellules.

Pour faire cette manoeuvre sur plusieurs journées, attends d'abord d'avoir un système qui marche sur une seule...

Mais si tu pouvais au passage répondre à ma question...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 oct. 2005, 14:31

Oui, j'avais demandé s'il n'y avait pas moyen de rajouter un séparateur unique, car il a précisé qu'il avait des espaces dans certains noms de villes, comment tu vas faire avec ta solution ?
Si tu fais ton explode sur un truc qui n'est pas toujours un séparateur, tu vas être bien embêté...
C'est vrai j'avais pas vu :?
Miantenant reste a savoir s'il a envi de rajouter des | dans les fichiers ...

Sinon, manière barbare: faire un explode sur le tiret ( explode("-",$match) ) entre les score (la pas de probleme c'est bien un séparateur dans tous les cas :wink: ). Puis de faire une serie de substr():

exemple
echo substr($match[2][0],0,-3).' '.substr($match[2][0],-2,1).' - '.substr($match[2][1],1,1).' '.substr($match[2][1],3);
a intégrer dans une boucle bien sur

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 oct. 2005, 14:55

Miantenant reste a savoir s'il a envi de rajouter des | dans les fichiers ...
des |, des # ou des ~... peu importe mais un séparateur unique, qui ne servirait qu'à séparer, ce serait beaucoup plus simple
si c'est un fichier de données, ce n'est pas grave d'en modifier le format, puisqu'on ça ne sert qu'à stocker, et l'affichage se fait proprement ensuite.
Mais il faudrait savoir d'où provient ce fichier, pas sûr qu'il puisse y toucher.

Après si ce n'est pas possible, il y aura toujours moyen de s'en sortir avec tes suggestions

Eléphant du PHP | 172 Messages

30 oct. 2005, 16:03

pour aller plus vite que ta boucle et etre sur de lire toutes les lignes du fichier je te propose ceci:
$match=array(); //tableau conteant toutes les données
$fichierFootD2 = 'resultatsD2.txt';
if (file_exists($fichierFootD2))
{
    $statfoot = fopen("resultatsD2.txt", "r");
    while ($ligne = fgets($statfoot)) 	//on boucle tant qu'il y a des lignes a lire dans le fichier
		$match[]=explode(" ",$ligne); // explode doit se faire sur l'espace puisque tu as des espaces dans ton fichier et non des |
    fclose($statfoot);
J'ai essayé ton système avec les array, mais j'ai pas tout compris, je n'arrive pas à affecter une variable à chaque catégories :?
Et je croyais que la solution avec file() convenait mieux, pourquoi avoir changé ? ça aurait été simple pour récupérer les lignes sans les 2 premières et les 2 dernières, puisque tu aurais pu utiliser les indices de cellules.

Pour faire cette manoeuvre sur plusieurs journées, attends d'abord d'avoir un système qui marche sur une seule...

Mais si tu pouvais au passage répondre à ma question...
C'est à dire que au départ cela me paraissait plus simple, mais comme précédemment, je n'arrive pas à reproduire la même chose qu'avec le code que j'ai fait, qui me semble plus simple, mais c'est sûr plus long.

Ensuite pour mes fichiers textes, je peux en faire ce que je veux, c'est pour cela que j'ai essayé en mettant des symboles | entre chaque éléments.

Donc pour l'instant, je cherche à faire que la 1ère ligne s'affiche dans un <th>, que la ligne suivante soit ignorée, que mes lignes des résultats s'affichent dans des cellules, et que les deux dernières lignes soient ignorées, le tout se répétant tout les xlignes.

Pour l'instant, avec le code que j'ai fait:
$fichierFootD2 = 'resultatsD2.txt';  
echo "<table id="resultats">";
        if (file_exists($fichierFootD2)) // si le fichier est accessible
        {
          $statfoot = fopen("resultatsD2.txt", "r");  // ouverture du fichier 
          $compteur = 1;
          while ($compteur < 15) // boucle afin de répéter le nbre de lignes
          {
          $compteur = $compteur + 1;
          $ligne = fgets($statfoot);  // affiche ligne/ligne
          list($equipe1, $score, $equipe2) = explode("|", $ligne);  // défni chaque variable séparé par le symbole |
          echo "
          <tr>
            <td>$equipe1</td>
            <td>$score</td>
            <td>$equipe2</td>
          </tr>";
          }
          fclose($statfoot);  // fermeture du fichier
        } 
        else {                // sinon retourne cette erreur
          echo "Erreur 10 (accès au fichier)";
        }
echo "</table>"
j'obtiens ceci.