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

Python Discussion :

parsing de string


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 15
    Points : 12
    Points
    12
    Par défaut parsing de string
    Bonjour à tous,

    J'espère que mon intitulé de sujet est correct

    Je travaille actuellement avec des fichier ayant des lignes de ce format :
    1251763920 udp 6:92:33:18:28:2839:else:537:2:728:12:13:15:12973:38:255:1:12977:255:56:5:13 tcp 1:1:else:6

    Je dois pour chaque ligne du fichier ajouter certaine valeur a des compteur :

    le fichier est construit ainsi :

    Date "nom de protocole" type:"nombre d'occurrence":type:"nombre d'occurrence" ainsi de suite jusqu'à "nom de protocole" type:...

    avec le mot else comme type pour les type non reconnu par le programme

    j'aimerais pour chaque type ajouter le nombre d'occurrence à un compteur.

    Actuellement j'ai splitté la chaine en une liste séparant chaque terme et je la parcours, mais y aurait-il un moyen "plus élégant" avec une regular expression par exemple ?

    Merci,

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Salut,


    On devrait pouvoir faire ça facilement.


    Mais je ne comprend pas bien:

    dans la ligne

    1251763920 udp 6:92:33:18:28:2839:else:537:2:728:12:13:15:12973:38:255:1:12977:255:56:5:13 tcp 1:1:else:6
    la date est 1251763920

    les types sont udp , else , tcp

    les nombres d’occurences sont 6:92:33:18:28:2839 pour udp

    les nombres d’occurences sont 537:2:728:12:13:15:12973:38:255:1:12977:255:56:5:13 et aussi 6 pour else

    les nombres d’occurences sont 1:1 pour tcp

    il y a un blanc devant et derriere udp et tcp, mais il y a : devant et derriere else

    C’est bien ça ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    presque ^^


    1251763920 est la date
    udp et tcp sont les deux type de protocole

    et ensuite les suite comme celle-ci sont :
    6:92:33:18:28:2839:else:537

    6 le type 92 le nombre d'occurrence
    33 le type 18 le nombre d'occurrence
    ainsi de suite
    else le type 537 le nombre d'occurence

    date et protocole sont séparé par des espace, les type:occurrence par des deux points

    tcp, n'apparait pas forcément à chaque ligne

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Ah oui d’accord.... je croyais poser une question bête, mais en fait c’est moi qui suis bête de ne pas avoir compris.
    Quoique si les explications étaient un tantinet plus développées ce ne serait pas plus mal.



    J’ai la solution, mais pas pour ta question .



    Je pense sortir la bonne solution dans 10 mn.
    Je fais avec une regex.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    héhé désolé, j'avais le nez dedans depuis un moment, après on oublie de bien décrire la chose

    Waou, ce serait génial ! Merci beaucoup de prendre du temps pour mon problème !

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Des minutes à rallonge....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    from collections import defaultdict
    import re
     
    nbo = defaultdict(int)
     
    with open('nbo.txt') as f:
        for match in re.finditer('(udp|tcp) ([else\d:]+)',f.read()):
            le_type = match.group(1) + '_'
            li = match.group(2).split(':')
            for i in range(0,len(li),2):
                nbo[le_type + li[i]] += int(li[i+1])
     
     
    for x in nbo:
        print(x,'  ',nbo[x])
    C'est en Python 3.1



    Avec un fichier dans lequel ta ligne d'exemple est présente 3 fois, ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    udp_33    54
    udp_1    38931
    udp_2    2184
    udp_5    39
    udp_else    1611
    tcp_1    2
    udp_6    276
    udp_28    8517
    udp_38    765
    udp_12    39
    udp_15    38919
    udp_255    168
    tcp_else    12

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Waou! C'est impressionnant!

    Merci beaucoup, tu m'as permis de gagner un temps précieux et surtout avoir un code plus propre et efficace ^^ j'étais entrain de bidouiller avec des find, des split et tout ça

    Encore merci !
    ++

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Pardon, le fichier qui donne les résultats ci-dessus ne comporte pas trois fois la ligne que tu as donnée en exemple, mais ceci (j’ai éliminé une section tcp pour conformer à l’absence éventuelle de tcp)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1251763920 udp 6:92:33:18:28:2839:else:537:2:728:12:13:15:12973:38:255:1:12977:255:56:5:13 tcp 1:1:else:6 
    1251763920 udp 6:92:33:18:28:2839:else:537:2:728:12:13:15:12973:38:255:1:12977:255:56:5:13
    1251763920 udp 6:92:33:18:28:2839:else:537:2:728:12:13:15:12973:38:255:1:12977:255:56:5:13 tcp 1:1:else:6

    j'étais entrain de bidouiller avec des find, des split et tout ça
    Ah oui ça, il ne faut pas s’y perdre.
    Les regex , c’est un truc qui me laisse encore pantois. Mais il ne faut pas s'y perdre non plus.
    Il faut un bon dosage.
    Comme entre le sel et le sucre dans la patisserie.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    je profite encore de ta présence,

    J'ai un peu de mal avec les regex... ca rentre lentement...
    Ici, si je veux ajouter un champ udp_total et tcp_total qui cumulerais la somme de tous les type rencontré, comment je peux procéder ?

    ps: t'as le droit de me dire débrouilles toi :p

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    C'est tout bon, je viens de comprendre ^^
    Encore merci ++

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

Discussions similaires

  1. Parse url string
    Par tidou95220 dans le forum Débutez
    Réponses: 3
    Dernier message: 04/03/2013, 16h28
  2. Parsing de String en Date
    Par benjibul dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 30/06/2011, 11h56
  3. Réponses: 1
    Dernier message: 06/05/2010, 16h24
  4. [1.x] Unable to parse query string
    Par JoceC dans le forum Symfony
    Réponses: 2
    Dernier message: 30/06/2008, 11h08
  5. Problème de parse de String vers Byte
    Par Johan.Mazel dans le forum Java ME
    Réponses: 5
    Dernier message: 25/07/2007, 12h56

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