Page 1 sur 3
Classement d'informations (fichier .log) dans un tableau
Posté : 15 juil. 2014, 20:51
par sn2GhostKiller
Bonjour à tous,
Je travaille en ce moment sur la réalisation de statistiques personnalisées concernant le classement d'un jeu (Counter Strike : Global Offensive). Disposant d'un serveur fonctionnant en Lan (local), j'aimerais utiliser les informations stockées sous forme de script dans un fichier .log, donc ça ressemble à ça :
L 07/15/2014 - 19:43:07: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "awp"
L 07/15/2014 - 19:43:07: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "p250"
L 07/15/2014 - 19:43:08: "Wayne<7><BOT><TERRORIST>" [403 1161 -16] killed "Quinn<5><BOT><CT>" [-35 1240 48] with "ak47" (headshot)
L 07/15/2014 - 19:43:10: "Derek<3><BOT><TERRORIST>" [275 -91 -150] killed "Dave<9><BOT><CT>" [488 -340 -96] with "ak47"
(sauf que c'est beaucoup plus long que ça).
Comme vous le voyez, toutes les événements qui se déroulent lors de la partie sont enregistrés sous cette forme tout au long du fichier .log.
Mon but est (concrètement) d'importer toutes ces informations (date, heure, pseudo du joueur, ...) dans un tableau, mais de manière à filtrer tous les caractères comme le L, les espaces, les tirets, les guillemets, mais également les informations qui ne me serviront pas, telles que le login STEAM complet (ex: <STEAM_1:1:84443486>).
Pourriez vous donc, s'il vous plaît, me donner quelques fonctions, ainsi que leurs paramètres, qui pourront m'aider à réaliser mon projet ?
Merci d'avance

Re: Classement d'informations (fichier .log) dans un tableau
Posté : 15 juil. 2014, 21:04
par sn2GhostKiller
Je me suis un peu écarté (vu que j'y travaille depuis quelques jours, je n'ai pas pensé à préciser quelques détails) :
mon objectif est au final d'avoir un tableau qui affiche celui qui a le plus de points en premier, puis le deuxième, ... et donc cela nécessite que les points marqués par le joueur A soient additionés, afin d'obtenir dans mon tableau un seul joueur A avec tous ses points marqués durant la partie (par exemple 30), et non 30 joueurs A par points marqués.
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 17 juil. 2014, 09:13
par sirakawa
Chalut,
Je suppose que tu n'es pas maitre du format du fichier:
[
html]
L 07/15/2014 - 19:43:07: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "awp"
L 07/15/2014 - 19:43:07: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "p250"
L 07/15/2014 - 19:43:08: "Wayne<7><BOT><TERRORIST>" [403 1161 -16] killed "Quinn<5><BOT><CT>" [-35 1240 48] with "ak47" (headshot)
L 07/15/2014 - 19:43:10: "Derek<3><BOT><TERRORIST>" [275 -91 -150] killed "Dave<9><BOT><CT>" [488 -340 -96] with "ak47"
[/html]
En récupérant le fichier ligne par ligne et en explosant chaque ligne par ": " (deux points espace) on obtient un tableau de ce genre:
( [0] => L 07/15/2014 - 19:43:07 [1] => "gK.sn2<2>" purchased "awp" )
ce qui avance un peu les choses
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 17 juil. 2014, 10:50
par sn2GhostKiller
Merci pour ta spontanéité. Effectivement ça m'avance déjà un peu ! Mais j'aimerais en savoir un peu plus sur certains autres points (si possible) :
_ Il faut savoir que ce fichier commence par des informations qui, pour le type de statistiques que je veux mettre en place, ne me servent à rien (au tout début du script, il me montre les paramètres de la partie, les pré-configurations que j'ai effectué, ...). Comment faire en sorte que le programme (mon code php) commence à prendre les données du fichier .log à une ligne que j'indiquerais ?
_ J'aimerais également que vous m'indiquiez comment faire en sorte que mon programme analyse à chaque fichier .log (donc à chaque partie), de façon automatique, les joueurs présents dans la partie, et enregistrer en leurs noms les actions qu'ils effectuent pendant la partie. (tout cela sera donc enregistrer dans ma base de donnée)
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 17 juil. 2014, 10:58
par sn2GhostKiller
PS : Le fichier .log se créé automatiquement lorsque je lance mon serveur, tout ce que se passe sur mon serveur est enregistré (en premier lieu, les pré-configs que j'ai paramétré, puis les parties lancées, paramètres des parties lancées, joueurs connectés puis toutes les actions de tous les joueurs, les déconnexions de chaques joueurs lorsqu'ils se déconnectent + les raisons de déconnexions (bannis, si c'est le cas s'est enregistré dans un fichier .txt, ping trop élevé, ou alors s'il s'est simplement déconnecté de la partie)). Enfin bref, tout cela s'enregistre dans le fichier, mais je peux tout de même accéder à ce fichier et en modifier les lignes si c'est ce que tu voulais savoir

Re: Classement d'informations (fichier .log) dans un tableau
Posté : 17 juil. 2014, 12:35
par sirakawa
OK,
Le fichier commence-t-il toujours par le même nombre de lignes qui ne t'intéressent pas: Si oui,c'est assez facile à gérer. Si non peux-tu identifier la première ligne utile (Je suppose qu'elle commene par un L) ?
Je suis d'avis d'arriver à stocker les infos utiles dans un tableau et de traiter ce tableau après...
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 17 juil. 2014, 13:42
par Wolan
Bonjour,
Je réponds juste pour l'extraction des données de la ligne de log.
Tu peux utiliser une expression régulière pour extraire précisément les morceaux utiles, comme dans l'exemple ci dessous :
<?php
$lignes = array('L 07/15/2014 - 19:43:08: "Wayne<7><BOT><TERRORIST>" [403 1161 -16] killed "Quinn<5><BOT><CT>" [-35 1240 48] with "ak47" (headshot)',
'L 07/15/2014 - 19:43:10: "Derek<3><BOT><TERRORIST>" [275 -91 -150] killed "Dave<9><BOT><CT>" [488 -340 -96] with "ak47"',
'L 07/15/2014 - 19:43:07: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "awp"',
'L 07/15/2014 - 19:43:07: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "p250"');
$pattern = '/L ([0-9\/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]*?)?"/';
foreach($lignes as $ligne)
{
preg_match($pattern,$ligne,$correspondances);
print_r($correspondances);
}
?>
Ce qui donne ça a à l'exécution :
Array
(
[0] => L 07/15/2014 - 19:43:08: "Wayne<7><BOT><TERRORIST>"
[1] => 07/15/2014
[2] => 19:43:08
[3] => Wayne<7><BOT><TERRORIST>
)
Array
(
[0] => L 07/15/2014 - 19:43:10: "Derek<3><BOT><TERRORIST>"
[1] => 07/15/2014
[2] => 19:43:10
[3] => Derek<3><BOT><TERRORIST>
)
Array
(
[0] => L 07/15/2014 - 19:43:07: "gK.sn2<2><STEAM_1:1:84443486><CT>"
[1] => 07/15/2014
[2] => 19:43:07
[3] => gK.sn2<2>
)
Array
(
[0] => L 07/15/2014 - 19:43:07: "gK.sn2<2><STEAM_1:1:84443486><CT>"
[1] => 07/15/2014
[2] => 19:43:07
[3] => gK.sn2<2>
)
La fonction preg_match remplit le tableau que tu lui fournit en troisiéme argument.
Le premier index du tableau est la ligne entiére et les index suivants correspondent aux éléments qui correspondent à tes parenthèses capturantes.
Si tu as besoin de compléter le pattern que j'ai utilisé dans l'exemple il faut que tu étudie un peu la syntaxe par contre.
Quelques liens sur le sujet :
Bonne journée
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 17 juil. 2014, 17:00
par sn2GhostKiller
Waouh !
C'est vraiment super ! Je ne m'attendais pas à avoir autant de réponses en si peu de temps, toutes vos aides me sont vraiment utiles, je vous remercie beaucoup ! Je me mets au travail dès demain ! Je tâcherais de bien consulter ces liens Wolan, merci. Et non, Sirakawa, en fait ça dépend de combien de joueurs entrent dans la partie, le fichier enregistre, ligne par ligne, les connexions de chaques joueurs, ce qui fait varier la place de la ligne ou les informations commencent à m'être utiles. Cependant, je vais essayer de faire en sorte que le programme analyse chaque nom de joueur lorsqu'ils se connectent :
L 07/15/2014 - 19:39:10: "gK.sn2<2><STEAM_1:1:84443486><>" entered the game
Il faut que (en incluant des structures de contrôle : if, then, else, ...) le programme en déduise que "si la ligne contient "entered the game", cela signifie que cette une indication de connexion d'un joueur, et donc d'enregistrer la chaîne se trouvant entre les guillemets et avant le <, sauf si le nom se trouve déjà dans le tableau attribué à cette partie".
De même, tout en utilisant des structures de contrôles, j'espère pouvoir faire en sorte que si le programme croise un "killed", il repère de même le nom entre les premiers guillemets comme celui qui marque le point et celui entre les deuxièmes guillemets comme celui qui est mort. En partant du principe que cela est possible, j'essaierais aussi de programmer un petit bonus : si il y a marqué "(headshot)", c'est qu'il y a eu un tir à la tête, enregistrer cette information et à la fin, inclure dans mes stats celui qui a fait le plus de headshots.
L 07/15/2014 - 19:40:42: "gK.sn2<2><STEAM_1:1:84443486><CT>" [-19 241 -16] killed "Wayne<7><BOT><TERRORIST>" [610 -494 -91] with "awp" (headshot)
Quoi qu'il en soit, je vous remercie de votre aide, pour l'instant ça m'a vraiment avancé ! Je vous en suis très reconnaissant

Re: Classement d'informations (fichier .log) dans un tableau
Posté : 17 juil. 2014, 17:13
par sn2GhostKiller
En fait, malgrès l'heure tardive, j'ai ne pas pu m'empêcher d'y penser, je pense que l'idéal serait en premier lieu de récupérer le contenu du fichier .log, puis d'utiliser une structure de contrôle qui analysera les lignes, et lorsqu'une ligne concernant la connexion d'un joueur, les points remportés par un joueurs, le décès (virtuel) d'un joueur, désamorçages de bombes, sauvetage d'otages, ... soient rencontrés par des mots clé ("killed", "entered the game", par exemple), alors le programme enregistre chaque information de façon classée dans un tableau. Selon vous, ça pourrait fonctionner dnas ce sens là ? (du moins est-ce que c'est possible...)
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 17 juil. 2014, 22:30
par sn2GhostKiller
Oh mince ! Désolé, pour les fautes d'orthographe... "^^
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 18 juil. 2014, 09:08
par sn2GhostKiller
Salut ! j'ai commencé à bosser dessus, d'ailleurs tes liens m'ont été très utiles Wolan ! Merci ! Donc, j'ai commencé par faire en sorte que le programme lise le fichier ligne par ligne, j'ai également fais en sorte que les lignes soient numérotées, mais il y a un p'tit problème :
230 L 07/15/2014 - 19:43:27: "Chet<4>" [955 -502 -158] killed "Vladimir<11>" [1117 -428 -214] with "ak47" (headshot)
231 L 07/15/2014 - 19:43:28: "gK.sn2<2>" purchased "awp"
232 L 07/15/2014 - 19:43:28: "gK.sn2<2>" purchased "p250"
233 L 07/15/2014 - 19:43:29: "Wayne<7>" purchased "m4a1"
234 L 07/15/2014 - 19:43:30: "sn4GhostGost<12>" [1 131 24] killed "Eric<6>" [172 -456 -76] with "awp" 235 L 07/15/2014 - 19:43:31: "Vladimir<11>
" purchased "awp" 236 L 07/15/2014 - 19:43:33: "Eric<6>
" purchased "m4a1" 237 L 07/15/2014 - 19:43:33: "Eric<6>
" purchased "p250" 238 L 07/15/2014 - 19:43:37: "sn4GhostGost<12>
" [901 58 -155] killed "Vladimir<11>" [993 431 192] with "awp" (headshot) 239 L 07/15/2014 - 19:43:41: "sn4GhostGost<12>
Comme vous le voyez à partir de la ligne 234... ça commence un peu à déconner.
Voici le code :
<?php
$log = file("test.log");
foreach ($log as $lineNumber => $lineContent)
{
echo $lineNumber,' ',$lineContent,'<br />';
}
?>
Qu'est-ce qui cloche selon vous ?
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 18 juil. 2014, 15:02
par sn2GhostKiller
Salut ! comment on fait pour envoyer un array en paramètre à la fonction preg_match ? Quand je le fais, il y a une erreur...
Merci d'avance !
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 18 juil. 2014, 16:18
par Wolan
Bonjour,
Quel est le message d'erreur exact ?
Bonne journée
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 18 juil. 2014, 22:41
par sn2GhostKiller
Et bien, Wolan, à l'éxecution, c'est ce message d'erreur qui s'affiche :
_ "Warning: preg_match() expects parameter 2 to be string, resource given in D:\wamp\www\stats_csgo\CsGoStats.php on line 26"
Et voilà le code (enfin celui qui concerne la partie problématique) :
_
<?php
$logfile = fopen("test.log", "r");
$log = array($logfile);
fclose($logfile);
$pattern = '/L ([0-9\/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]*?)?"/';
foreach($log as $statInfo)
{
preg_match($pattern,$statInfo,$stat);
print_r($stat);
echo '<br />';
}
?>
(je me suis aidé de ce que tu avais mis à disposition

)
Re: Classement d'informations (fichier .log) dans un tableau
Posté : 18 juil. 2014, 23:39
par Wolan
Bonsoir,
Si tu veux récupérer toutes les lignes du fichier sous forme de tableau avec une ligne par index utilise la fonction file :
$logfile = file("test.log");
Plutôt que d'utiliser :
$log = array($logfile);
La fonction fopen te retourne une variable qui représente le fichier elle ne te retourne pas le contenu directement (pour ça il faut utiliser des méthodes comme fgets).
Du coup quand tu la place dans un tableau tu as juste un tableau 1 qui contient la variable représentant le fichier ce qui n'est pas une variable de type string d'où le warning que tu obtiens :
preg_match() expects parameter 2 to be string.
Si tu veux voir comment utiliser fopen regarde cette
page. Mais file devrait faire l'affaire.
Bonne soirée