IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Extraire certaines informations d'un fichier de log


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut Extraire certaines informations d'un fichier de log
    Bonjour, Je suis débutant et je bloque sur un regex.

    j'ai un log avec sa:
    sauteligne
    sauteligne

    Rcon from 90.15.93.185:27244:
    set
    Cvar_Set2: ban -
    Cvar_Set2: numban 0
    BAN: Un joueur a été bannis numero: 0 raison: test
    sauteligne
    sauteligne
    sauteligne
    sauteligne_reason
    sauteligne
    sauteligne

    Cvar_Set2: command
    Cvar_Set2: numban -
    Cvar_Set2: ban_reason Raison Inconnue
    sauteligne
    sauteligne

    BAN: pseudo est bannis! ip: 90.105.9.85 raison: test
    sauteligne
    sauteligne
    je souhaite récupérer le rouge, le vert étant variable et pouvant être long avec des caractères .*~ etc ainsi que des nombre bref n'importe quoi.

    j'ai sa qui me récup les 4 premières valeur rouge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('`Rcon from (.*?)\:.*?\nset\r?\nCvar_Set2\: ban -\r?\nCvar_Set2\: numban ([0-9]*?)\r?\nBAN\: Un joueur a été bannis numero\: (.*?) raison\: (.*)`', $filename, $ban);
    la suite j'y arrive pas, déjà je sais pas si je doit utiliser l'option m sa enlève les retour \r \n? ou si je continue comme sa et dans ce cas comment chercher du texte aléatoire en comptant les retour sans l'option s qui fausserai le début du regex?

    Un coup de main serait le bienvenue Merci.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Je pense qu'il serait plus simple de traiter le fichier ligne par ligne, les regex seraient plus légère et plus simple à mettre en place.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  3. #3
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    merci de ton aide, ligne par ligne impossible en fait car:
    Rcon from 90.15.93.185:27244:
    set
    il y en a beaucoup, faut qu'il y ai sa juste après:
    Cvar_Set2: ban -
    Cvar_Set2: numban 0
    BAN: Un joueur a été bannis numero: 0 raison: test
    ou alors tester plusieurs ligne à la fois?
    et c'est toujours économe en ressource?
    je patauge.

    merci.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  4. #4
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    La raison qui me poussais à proposer "ligne par ligne" est le fait que ce soit un fichier de log, et un fichier de log, ca peut être assez gros en volume. Pour traiter des données sur l'ensemble du fichier de log par une regex, il faut que la totalité du fichier soit chargé en mémoire. Ca pourrait être un problème d'après moi.

    Pour le traitement ligne par ligne, tu peux envisager de tester chaque ligne et de positionner un flag des que ca correspond :

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    tant que lire ligne:
      si ligne = 'rcon' alors flag = 1
      si ligne = 'cvar_set2: ban' et flag = 1 alors pattern=ok
      si ligne = 'cvar_set2: numban' et flag = 2 alors pattern=ok
      si ligne = 'ban:' et flag = 3 alors pattern=ok
     
      si pattern = ok alors
        flag++
     
      si flag=4 alors 
        j'ai ma série de lignes qui se suivent
      sinon
        flag = 0
    Juste une idée d'algo pour ton cas, mais faudrait réfléchir plus avant, tester et simuler.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  5. #5
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    merci, je comprend mieux, effectivement je chargeai le fichier entier
    puis preg_replace_all pour virer toute les lignes inutile
    puis mes preg_match_all

    du coup je passe en ligne par ligne avec preg_replace et preg_match, sa va alléger la mémoire mais késako du temps un preg_match_all est pas plus rapide que preg_match sur chaque ligne?

    le plus c'est que je vais pouvoir mettre une barre de progression c'est bien pratique
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  6. #6
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    En absolu un preg_match_all doit être plus rapide que plusieurs preg_match, vu que d'une part, on aura un seul appel de fonction et de plus, d'après mes souvenirs, la regex est "compilé".

    Mais entre la théorie et la pratique y'a une marge, je pense que si tu te trouves avec un fichier de 30 mo de log, tu vas avoir du mal à le gérer avec un preg_match_all, d'une part pour le problème de devoir charger le fichier en mémoire et d'autre part la taille que va prendre le tableau résultat.

    De plus, un preg_match_all analyse tout le contenu du fichier, alors que tu peux avec un algo relativement simple, déjà écarter un bon nombre de ligne.

    Les regex sont très puissants, mais il me parait abbérant, dans beaucoup de cas, de vouloir faire reposer un traitement complet sur les regex alors qu'on peut faire beaucoup plus simple avec juste des tests de chaines (pour une grande partie du traitement).

    Après en dehors de la faisabilité lié au problème mémoire, le plus simple serait de faire un petit benchmark rapide pour comparer les deux solutions.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  7. #7
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    je test sa lundi et je poste les codes et temps.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  8. #8
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    alors voila j'ai testé avec 2 preg_replace qui nettoye le fichier, sans les preg_match.

    en chargeant le fichier de 36mo avec file_gets_contents
    2 preg_replace sur la variable contenant le fichier
    test effectué 2x:
    Parsing fichier log terminé en 27.83 secondes
    Parsing fichier log terminé en 25.89 secondes

    en chargeant le fichier de 36mo avec file
    2 preg_replace sur chaque ligne du tableau
    test effectué 2x:
    Parsing fichier log terminé en 51.21 secondes
    Parsing fichier log terminé en 53.05 secondes

    donc sa double sachant que mon fichier contient 423566 lignes...

    utilisation mémoire max 146mo...
    comment charger ligne par ligne et pas tout pour eviter d'utiliser tant de mémoire? merci.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  9. #9
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Si j'ai bien compris ton test, tu fais dans le 2ième cas, 2 preg_replace sur chaque ligne du fichier.

    Je voyais plus un test classique sur chaque ligne et ne faire le preg_replace que sur les lignes ayant été validé par le test classique.

    Ou peut être ai je mal compris.


    Concernant le traitement global du fichier, je ne vois vraiment pas comment le lancer sans charger le fichier auparavant en mémoire ^^
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  10. #10
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    je vais ouvrire une nouvelle discussion pour le traitement du fichier sans le charger complètement.

    Merci pour ton aide, je met pas résolu car j'ai pas la solution en place pour l'instant.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraire les informations d'un fichier avi
    Par rolls dans le forum C
    Réponses: 2
    Dernier message: 16/04/2009, 16h59
  2. Réponses: 0
    Dernier message: 15/04/2009, 15h57
  3. extraire les informations d'un fichier XML
    Par touf35 dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/02/2008, 18h16
  4. Extraire certaines informations depuis un fichier
    Par maxxou91 dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 19h56
  5. extraire certaines données d'un fichier texte
    Par davz88 dans le forum C++
    Réponses: 11
    Dernier message: 26/03/2005, 13h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo