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 :

Parser un fichier log d’événements


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Par défaut Parser un fichier log d’événements
    Bonjour à tous,

    Je m'intéresse depuis peu au langage Python pour lequel j'ai appris les rudiments grâce aux tutoriels accessibles sur ce site.


    J'essaye de traiter des données de logs d'un jeu pour pouvoir en tirer certaines statistiques.

    Celui-ci se compose ainsi (extrait):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    T:10 AType:9 AID:39936 COUNTRY:101 POS(184785.5938, 2.6443, 240943.4375) IDS()
    T:68510 AType:12 ID:700446 TYPE:Bf 110 G-2 COUNTRY:201 NAME:noname PID:-1 POS(259973.9219,49.5342,54857.3594)
    T:68510 AType:12 ID:701470 TYPE:BotPilot_Bf109 COUNTRY:201 NAME:BotPilot_Bf109 PID:700446 POS(259973.7656,49.9501,54856.1445)
    T:68510 AType:10 PLID:700446 PID:701470 BUL:6450 SH:0 BOMB:6 RCT:0 (259973.9219,49.4752,54857.3555)
    T:130301 AType:1 AMMO:SHELL_GER_20x82_HE AID:781354 TID:1040430
    T:130303 AType:2 DMG:0.0005 AID:-1 TID:1040430 POS(244528.1563,3838.3601,132309.1563)
    T = temps écoulé
    AType:X = type évènement
    ID = identifiant de l'objet
    COUNTRY = n° de pays
    POS = coordonnées x,y,z
    AMMO = munitions utilisées
    PID = PilotID
    AID = Airplane ID
    TID = Target ID

    Les éléments que je souhaite pouvoir ressortir sont par exemple:
    - Liste des objets détruits (selon le type et la nation)
    - Liste des objets endommagés et non détruits (selon le type et la nation)
    - Liste des pilotes tués
    - Munitions utilisées par nation
    - Avions utilisés par aéroports
    - etc...


    Je ne sais pas comment organiser mon travail, dois-je créer des classes ou non, etc... ?

    Pour l'instant, j'ai commencé à créer des dictionnaires pour les aéroports (et compte faire de même pour les avions et les pilotes):

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    missionreport = open ("missionReport(2018-11-21_20-45-18)[0].txt", "r")
     
     
     
    airfield = []
     
    while 1:
        text = missionreport.readline()
        condition = "AType:9"
        if condition in text:
                textsplit = text.split()
                airfieldNumber = textsplit[2]
                airfieldNumber = int(airfieldNumber[4:10])
                country = textsplit[3]
                country = int(country[8:11])
                positionx = textsplit[4]
                positionx = float (positionx[4:14])
                positiony = textsplit[5]
                positiony = float (positiony[0:6])
                positionz = textsplit[6]
                positionz = float (positionz[0:10])
                airfield.append({"airfieldNumber" : airfieldNumber, "country" : country, "position" : (positionx, positiony, positionz)})
        if text == "":
            break
     
    print (airfield)
    Ce qui donne une liste de dictionnaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{'airfieldNumber': 39936, 'country': 101, 'position': (184785.593, 2.6443, 240943.437)}, {'airfieldNumber': 88064, 'country': 101, 'position': (229651.187, 54.84, 186389.89)}, {'airfieldNumber': 91136, 'country': 201, 'position': (270552.656, 64.004, 149697.609)}, {'airfieldNumber': 102400, 'country': 101, 'position': (224910.171, 27.547, 237144.687)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 540672, 'country': 201, 'position': (258118.234, 42.488, 49440.5781)}, {'airfieldNumber': 573440, 'country': 201, 'position': (259973.921, 47.668, 54857.3633)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 182272, 'country': 201, 'position': (274105.531, 62.012, 120702.828)}, {'airfieldNumber': 91136, 'country': 101, 'position': (270552.656, 64.004, 149697.609)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}, {'airfieldNumber': 604160, 'country': 201, 'position': (242543.484, 72.571, 80632.625)}]
    Mais je rencontre déjà deux problèmes:
    - ligne 19: positiony = float (positiony[0:6]) // les coordonnées sont sur 6 ou 7 caractères => ici j'ai mis 6 car sinon je prends la virgule
    - ligne 22 : j'ai des doublons et je n'arrive pas à gérer avec la condition "if airfieldNumber not in airfield" (problème je compare avec la liste et non le contenu de la bibliothèque elle même)

    Pouvez-vous m'aiguillez ?

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Il faut faire des regex. Vous ne vous en sortirez jamais sinon si vous devez écrire les positions de l'information pour chaque cas de figure !

    Ou alors au moins définir les mots clés que vous rechercher (AType, AID, etc... et faire le découpage en les détectants). En plus tantot vous avez une position écrite POS(x, y, z) et tantot vous avez juste écrit (x,y,z) dans le fichier, donc il va falloir traiter ces cas là également.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Citation Envoyé par fabgenius Voir le message
    Je ne sais pas comment organiser mon travail, dois-je créer des classes ou non, etc... ?

    Pour l'instant, j'ai commencé à créer des dictionnaires pour les aéroports (et compte faire de même pour les avions et les pilotes)
    Dans un premier temps, il faut lire les données, i.e. transformer une ligne de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T:10 AType:9 AID:39936 COUNTRY:101 POS(184785.5938, 2.6443, 240943.4375) IDS()
    en une représentation plus "commode" à manipuler, genre une liste de tuples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ ('T', 10), ('AType', 9),  ('AID', 39936),  ('COUNTRY', 101),  ('POS', (184785.5938, 2.6443, 240943.4375)),  ('IDS', ())]
    Ce qui est déjà un sacré boulot car le contenu de vos lignes varie suivant AType et vos champs parfois irréguliers.
    Donc le premier boulot va être de récupérer le AType pour savoir quoi chercher/trouver dans le reste.
    Et côté code, si vous savez utiliser les expressions régulières, le module re apporte cette fonctionnalité là au programmeur Python. Sinon, ben il va falloir chercher le 2ème espace pour découper le début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ('T', 10), ('AType', 9), "le reste à analyser" ]
    puis naviguer dans "le reste à analyser" pour obtenir la liste de tuple attendue.

    Il est facile de passer d'une liste de tuples à un dictionnaire (si vous y tenez) et de trier.
    note: personnellement dans ce cas la, j'utilise souvent des namedtuple

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Il faut faire des regex. Vous ne vous en sortirez jamais sinon si vous devez écrire les positions de l'information pour chaque cas de figure !

    Ou alors au moins définir les mots clés que vous rechercher (AType, AID, etc... et faire le découpage en les détectants). En plus tantot vous avez une position écrite POS(x, y, z) et tantot vous avez juste écrit (x,y,z) dans le fichier, donc il va falloir traiter ces cas là également.
    Re,

    j'ai fait quelques recherches et j'ai trouvé un post similaire ici: https://www.developpez.net/forums/d1...ns-regulieres/

    Sur le site https://regex101.com/ j'arrive à "matcher" les "events type 0" avec l'expression:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^T:(?P<tik>\d+) AType:0 GDate:(?P<date>\d{4}.\d{1,2}.\d{1,2}) GTime:\d{1,2}:\d{1,2}:\d{1,2} MFile:(?P<file_path>.+) MID:\d* GType:(?P<game_type_id>\d+) CNTRS:(?P<countries>[,:\d]+) SETTS:(?P<settings>\d+) MODS:(?P<mods>\d) PRESET:(?P<preset_id>\d)
    cela donne bien un "full match"

    Si je comprends bien l'expression ?P<nom groupe> permet d'affecter a valeur comprise dans cet espace à un groupe donné, c'est cela ?

    Par contre je ne saisis pas trop le sens du re.compile ni comment il s'utilise (dois je déclarer les groupes au préalables ? si oui en tant que liste ?). Par ailleurs, comment puis je ensuite accéder au données ?

    pour l'instant j'ai fait cela à partir de la 1ère ligne du log

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while 1:
        line = missionreport.readline()
     
    # T:0 AType:0 GDate:1943.11.2 GTime:15:45:0 MFile:Multiplayer/Kuban_4\Kuban_4_Welcome_to_crimea2.msnbin MID: GType:2 CNTRS:0:0,101:1,201:2 SETTS:000000000010000100000000110 MODS:0 PRESET:0 AQMID:0 ROUNDS: 1 POINTS: 5000
        Atype0=  r"^T:(?P<tik>\d+) AType:0 GDate:(?P<date>\d{4}.\d{1,2}.\d{1,2}) GTime:\d{1,2}:\d{1,2}:\d{1,2} MFile:(?P<file_path>.+) MID:\d* GType:(?P<game_type_id>\d+) CNTRS:(?P<countries>[,:\d]+) SETTS:(?P<settings>\d+) MODS:(?P<mods>\d) PRESET:(?P<preset_id>\d)"
        regex = re.compile(Atype0)
        match = regex.search(line)
        if match != None:           
            tik = match.group("tik")
            print ("tik :", tik)
            date = match.group("date")
            print ("date :", date)
        if line == "":
            break

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 817
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fabgenius Voir le message
    Par contre je ne saisis pas trop le sens du re.compile ni comment il s'utilise
    Bonjour

    Ca permet d'encoder ta regex dans un objet directement utilisable. C'est surtout utile si tu utilises ta regex plusieurs fois.
    Exemple: plutôt que d'écrire
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    re.search(truc, chaine1)
    ... (autres lignes de code)...
    re.search(truc, chaine2)
    ... (autres lignes de code)...
    re.search(truc, chaine3)

    tu pourras passer par re.compile ce qui évite cette répétition de la regex "truc"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    trucC=re.compile(truc)
    trucC.search(chaine1)
    ... (autres lignes de code)...
    trucC.search(chaine2)
    ... (autres lignes de code)...
    trucC.search(chaine3)
    Ainsi, "truc" n'est écrit qu'une seule fois et si demain il change, tu ne le changes qu'une seule fois dans ton code.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    C'est surtout utile si tu utilises ta regex plusieurs fois.
    Relire la documentation:
    The compiled versions of the most recent patterns passed to re.compile() and the module-level matching functions are cached, so programs that use only a few regular expressions at a time needn’t worry about compiling regular expressions.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 817
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    The compiled versions of the most recent patterns passed to re.compile() and the module-level matching functions are cached, so programs that use only a few regular expressions at a time needn’t worry about compiling regular expressions.
    Si mon traducteur est fiable, alors ça se lit ainsi "Les versions compilées des modèles les plus récents transmis à re.compile () et les fonctions de correspondance au niveau du module sont mises en cache. Par conséquent, les programmes n’utilisant que quelques expressions régulières à la fois n’ont pas à se soucier de la compilation." donc je ne vois pas tellement en quoi cela infirme ce que j'ai écrit plus tôt quand je dis que ce n'est utile que si on utilise la même regex plusieurs fois.

    Citation Envoyé par wiztricks Voir le message
    Relire la documentation
    Ben justement je l'ai lue !!! Cette doc donne un exemple
    The sequence

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prog = re.compile(pattern)
    result = prog.match(string)

    is equivalent to

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    result = re.match(pattern, string)
    Ce qui correspond assez fiablement avec mon propre exemple (enfin si on fait abstraction que moi je l'avais écrit dans l'autre sens)

    Ensuite la doc rajoute

    but using re.compile() and saving the resulting regular expression object for reuse is more efficient when the expression will be used several times in a single program.
    Ce qui se traduit par "Toutefois, utiliser re.compile () et enregistrer l'objet d'expression régulière résultant pour le réutiliser est plus efficace lorsque l'expression sera utilisée plusieurs fois dans un seul programme." ce qui, oh surprise !!! correspond exactement à ce que j'avais écrit.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Moi je traduis çà par "le module regexp cache les expressions régulières (compilées çà va de soi) utilisées récemment".
    Et plus précisément les 512 dernières (ce qui en fait un paquet).
    Donc inutile de se fatiguer à les compiler soi même...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Pour ma part j'utilise re.compile principalement pour "l'écriture", ça permet d'avoir la pattern avec ces éventuelles options sur une même ligne (ou bloc de lignes) et de donner à cet ensemble un nom parlant, sans pour autant encombrer la ligne où s'effectue la recherche proprement dite. C'est pratique lorsque les patterns sont longues.




    Mes questions sont:
    • Est-ce que la valeur de AType détermine le format du reste de la ligne (toujours les même champs, toujours le même ordre)?
    • Combien y-a-t'il de AType différents et est-ce-qu'ils t'intéressent tous? (Fourni au moins un exemple de ligne pour chaque AType).

  10. #10
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Par défaut
    Re,

    Merci à tous pour vos interventions.

    Il y a 21 AType différents et chaque AType à un format de ligne spécifique qui reste formaté de manière identique.

    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
    16
    17
    18
    19
    20
    21
    22
    23
        "Event and action type"
        MissionStart = 0
        Hit = 1
        Damage = 2
        Kill = 3
        PlayerMissionEnd = 4
        TakeOff = 5
        Landing = 6
        MissionEnd = 7
        MissionObjective = 8
        AirfieldInfo = 9
        PlayerPlane = 10
        GroupInit = 11
        ObjectSpawned = 12
        InfluenceAreaHeader = 13
        InfluenceAreaBoundary = 14
        LogVersion = 15
        BotUninit = 16
        PosChanged = 17
        BotEjectLeave = 18
        RoundEnd = 19
        Join = 20
        Leave = 21
    Voici quelques exemples qui m'intéressent:

    Liste des objets et leurs nationalités
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T:203 AType:12 ID:220160 TYPE:dugout[32266,0] COUNTRY:201 NAME:Bunker PID:-1 POS(225177.4063,12.3517,239741.1250)

    Apparition d'un avion (BF-110 n°700446) puis apparition du pilote associé et emport de l'avion (playerName n°701470, emport de 6450 cartouches et 6 bombes, fuel à 65%):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T:68510 AType:12 ID:700446 TYPE:Bf 110 G-2 COUNTRY:201 NAME:noname PID:-1 POS(259973.9219,49.5342,54857.3594)
    T:68510 AType:12 ID:701470 TYPE:BotPilot_Bf109 COUNTRY:201 NAME:BotPilot_Bf109 PID:700446 POS(259973.7656,49.9501,54856.1445)
    T:68510 AType:10 PLID:700446 PID:701470 BUL:6450 SH:0 BOMB:6 RCT:0 (259973.9219,49.4752,54857.3555) IDS:34c54268-1f3f-4206-ad8f-5d3c0370bcc2 LOGIN:828dfc6b-8f3d-466e-ad09-d4901ff60abe NAME:playerName TYPE:Bf 110 G-2 COUNTRY:201 FORM:0 FIELD:573440 INAIR:2 PARENT:-1 ISPL:1 ISTSTART:1 PAYLOAD:2 FUEL:0.6500 SKIN:bf110g2/bf110g2_skin_13.dds WM:3
    Décollage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T:98990 AType:5 PID:700446 POS(260790.7813, 67.9200, 54241.0547)

    Tirs et dommage:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    T:130277 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130284 AType:2 DMG:0.0007 AID:781354 TID:1040430 POS(244484.9219,3838.1096,132324.7031)
    T:130291 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130292 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130294 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130294 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130296 AType:1 AMMO:SHELL_GER_20x82_HE AID:781354 TID:1040430
    T:130296 AType:1 AMMO:SHELL_GER_20x82_HE AID:781354 TID:1040430
    T:130297 AType:2 DMG:0.0008 AID:781354 TID:1040430 POS(244516.1563,3838.2837,132313.4688)
    T:130298 AType:2 DMG:0.0008 AID:781354 TID:1040430 POS(244518.5469,3838.2983,132312.6094)
    T:130298 AType:1 AMMO:SHELL_GER_20x82_AP AID:781354 TID:1040430
    T:130299 AType:2 DMG:0.0007 AID:781354 TID:1040430 POS(244520.9531,3838.3135,132311.7500)
    T:130300 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130300 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130301 AType:2 DMG:0.0009 AID:781354 TID:1040430 POS(244523.3594,3838.3286,132310.8906)
    T:130301 AType:2 DMG:0.0009 AID:781354 TID:1040430 POS(244525.7656,3838.3442,132310.0156)
    T:130301 AType:1 AMMO:SHELL_GER_20x82_HE AID:781354 TID:1040430
    T:130303 AType:2 DMG:0.0005 AID:-1 TID:1040430 POS(244528.1563,3838.3601,132309.1563)
    T:130303 AType:2 DMG:0.0016 AID:781354 TID:1040430 POS(244530.5625,3838.3760,132308.2969)
    T:130303 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130304 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130304 AType:2 DMG:0.0103 AID:781354 TID:1040430 POS(244532.9688,3838.3921,132307.4375)
    T:130305 AType:2 DMG:0.0076 AID:781354 TID:1040430 POS(244535.3750,3838.4084,132306.5781)
    T:130306 AType:2 DMG:0.0058 AID:781354 TID:1040430 POS(244537.7813,3838.4246,132305.7031)
    T:130306 AType:1 AMMO:SHELL_GER_20x82_HE AID:781354 TID:1040430
    T:130308 AType:1 AMMO:explosion AID:781354 TID:1040430
    T:130308 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    T:130308 AType:1 AMMO:explosion AID:781354 TID:1041454
    T:130309 AType:1 AMMO:explosion AID:781354 TID:1040430
    T:130310 AType:1 AMMO:explosion AID:781354 TID:1041454
    T:130310 AType:1 AMMO:SHELL_GER_20x82_AP AID:781354 TID:1040430

    Kill:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T:146236 AType:3 AID:-1 TID:781354 POS(241334.2500,55.1885,112615.4609)
    Atterrissage, sortie du joueur et "sortie" de l'avion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T:226060 AType:6 PID:700446 POS(260387.9688, 49.6140, 54222.0234)
    T:229163 AType:4 PLID:700446 PID:701470 BUL:6450 SH:0 BOMB:0 RCT:0 (260384.9844,49.5359,54227.3320)
    T:229166 AType:16 BOTID:701470 POS(260383.7813,49.9416,54227.1523)
    Exemple synthétique de la structure:

    Nom : Capture.JPG
Affichages : 1004
Taille : 201,7 Ko

    Idéalement, il faudrait que je puisse enregistrer les données en "file" avec le format suivant (qui varierait en fonction du type d’événement":
    (AType, avion concerné, joueur concerné, autre info, position de l événement)

    Avec cela je pourrais peut être faire des recherches par couple (avion / type d’événement) du style:
    if "tel avion" est dans la liste "tel événement A" => traiter les informations "y"

  11. #11
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Dans ce cas là pour chacun de tes types définis l'ensemble des mots-clés que tu vas devoir cherché. Tu peux exclure T: et Atype: qui sont présent partout.

    Ex, je remplis seulement le Atype1, il faudra tout remplir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    keywords = [ [ keywords_atype0 ...],
    [ 'AMMO', 'AID', 'TID' ], 
    [ keywords_atype2 ...],
    [ keywords_atype3 ...],
    ...
    ]
    Une fois que tu as cela, pour chaque ligne, tu isoles T et Atype. Et ensuite en fonction du Atype tu cherches les autres mots clés pour isolé tout les champs, en transformer ta ligne en un dictionnaire ou un namedtuple par exemple.

  12. #12
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Par défaut
    Re,

    Le tik j'en aurais besoin pour connaitre l’événement le plus récent.

    L'un des soucis que j'ai et que je n'ai pas un identifiant spécifique/différent pour chaque ligne d'un même Atype (type d’événement) car un même événement peut se reproduire deux fois (ou dans la même seconde - tick).

    Pour y remédier j'ai essayé de créer un objet namedtuple avec le n° de la ligne analysée (line number) mais sans succès (cela n'enregistre que le dernier événement du Atype). Où est mon erreur ?

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    while 1:
        line = missionreport.readline()
        line_number= "line_number_"+str(n)
     
    # "INITIAL" Event Type
    # T:0 AType:0 GDate:1943.11.2 GTime:15:45:0 MFile:Multiplayer/Kuban_4\Kuban_4_Welcome_to_crimea2.msnbin MID: GType:2 CNTRS:0:0,101:1,201:2 SETTS:000000000010000100000000110 MODS:0 PRESET:0 AQMID:0 ROUNDS: 1 POINTS: 5000
        Atype_0=  r"^T:(?P<tik>\d+) AType:0 GDate:(?P<date>\d{4}.\d{1,2}.\d{1,2}) GTime:\d{1,2}:\d{1,2}:\d{1,2} MFile:(?P<file_path>.+) MID:\d* GType:(?P<game_type_id>\d+) CNTRS:(?P<countries>[,:\d]+) SETTS:(?P<settings>\d+) MODS:(?P<mods>\d) PRESET:(?P<preset_id>\d)"
        regex = re.compile(Atype_0)
        match = regex.search(line)
        if match != None:           
            line_number = Init_Event(match.group("tik"), match.group("date"))
     
    # "HIT" Event Type
    # T:130277 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
        Atype_1 = r"^T:(?P<tik>\d+) AType:1 AMMO:(?P<ammo>[-\w]+) AID:(?P<attacker_id>\d+) TID:(?P<target_id>\d+)$"
        regex = re.compile(Atype_1)
        match = regex.search(line)
        if match != None:
            line_number = Hit_Event(match.group("tik"), match.group("ammo"), match.group("attacker_id"), match.group("target_id"))
     
    # "DAMAGED" Event Type
    # T:194164 AType:2 DMG:0.0040 AID:1202220 TID:1178645 POS(280906.0000,5691.9624,145361.6250)
        Atype_2 = r"^T:(?P<tik>\d+) AType:2 DMG:(?P<damage>\S{5,6}) AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_2)
        match = regex.search(line)
        if match != None:
            line_number = Damaged_Event(match.group("tik"), match.group("damage"), match.group("attacker_id"), match.group("target_id"), match.group("posx"), match.group("posy"), match.group("posz"))
     
     
        n = n+1    
     
        if line == "":
            break
    Et mon deuxième problème comment rechercher facilement les informations dans le namedtuple, j'ai fait quelque recherche mais les exemples donnés nécessitent de connaître le nom du sous-objet (ce que je ne connaîtrais pas) ?

    Merci d'avance pour votre aide !

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Citation Envoyé par fabgenius Voir le message
    Merci d'avance pour votre aide !
    Relisez votre code, il parcourt tout le fichier pour produire quoi?
    Déjà il est inutile de redéfinir vos expressions et de les compiler à chaque itération: dégager tout çà de la boucle et çà vous permettra peut être d'y voir un peu plus clair sur ce qu'il se passe.

    Citation Envoyé par fabgenius Voir le message
    Et mon deuxième problème comment rechercher facilement les informations dans le namedtuple, j'ai fait quelque recherche mais les exemples donnés nécessitent de connaître le nom du sous-objet (ce que je ne connaîtrais pas) ?
    Pour l'instant vous en être encore à la construction d'une liste de tuples (named ou pas) à partir de vos enregistrements....et déjà c'est laborieux! Dans une deuxième étape peut être sera-t-il nécessaire de trier ces enregistrements suivant un critère donné. A ce moment là, la première partie sera "stabilisée" et vous aurez des exemples à poster pour permettre de comprendre de quoi vous parlez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Par défaut
    Re,

    Merci.

    J'ai essayé d'avancer et j'ai trouvé cette solution avec un exemple de calcul:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    import re
    from collections import namedtuple
     
    Init_Event = namedtuple("Init_Event", "tik, date")
    liste_init_event = []
    Hit_Event = namedtuple("Hit_Event", "tik, ammo, attacker_id, target_id")
    liste_hit_event = []
    Damaged_Event = namedtuple("Damaged_Event", "tik, damage, attacker_id, target_id, posx, posy, posz")
    liste_damaged_event = []
    Kill_Event = namedtuple("Kill_Event", "tik, attacker_id, target_id, posx, posy, posz")
    liste_kill_event = []
    Player_End_Event = namedtuple("Player_End_Event", "tik, aircraft_id, bot_id, cartridges, shells, bombs, rockets, posx, posy, posz")
    liste_player_end_event = []
    Take_Off_Event = namedtuple("Take_Off_Event", "tik, aircraft_id, posx, posy, posz")
    liste_take_off_event = []
    Land_Event = namedtuple("Land_Event", "tik, aircraft_id, posx, posy, posz")
    liste_land_event = []
    Mission_End_Event = namedtuple("Mission_End_Event", "tik, ")
    Airfield_Event = namedtuple("Airfield_Event", "tik, airfield_id, country_id, posx, posy, posz, aircraft_id_list")
    liste_airfield_event = []
    Player_Plane_Event = namedtuple("Player_Plane_Event", "tik, aircraft_id, bot_id, cartridges, shells, bombs, rockets, posx, posy, posz, payload_id, fuel, weapon_mods_id")
    liste_player_plane_event = []
     
    while 1:
        line = missionreport.readline()
     
    # "INITIAL" Event Type
    # T:0 AType:0 GDate:1943.11.2 GTime:15:45:0 MFile:Multiplayer/Kuban_4\Kuban_4_Welcome_to_crimea2.msnbin MID: GType:2 CNTRS:0:0,101:1,201:2 SETTS:000000000010000100000000110 MODS:0 PRESET:0 AQMID:0 ROUNDS: 1 POINTS: 5000
        Atype_0=  r"^T:(?P<tik>\d+) AType:0 GDate:(?P<date>\d{4}.\d{1,2}.\d{1,2}) GTime:\d{1,2}:\d{1,2}:\d{1,2} MFile:(?P<file_path>.+) MID:\d* GType:(?P<game_type_id>\d+) CNTRS:(?P<countries>[,:\d]+) SETTS:(?P<settings>\d+) MODS:(?P<mods>\d) PRESET:(?P<preset_id>\d)"
        regex = re.compile(Atype_0)
        match = regex.search(line)
        if match != None:           
            init_event = Init_Event(match.group("tik"), match.group("date"))
            liste_init_event = liste_init_event + [init_event]
     
    # "HIT" Event Type
    # T:130277 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
        Atype_1 = r"^T:(?P<tik>\d+) AType:1 AMMO:(?P<ammo>[-\w]+) AID:(?P<attacker_id>\d+) TID:(?P<target_id>\d+)$"
        regex = re.compile(Atype_1)
        match = regex.search(line)
        if match != None:
            hit_event = Hit_Event(match.group("tik"), match.group("ammo"), match.group("attacker_id"), match.group("target_id"))
            liste_hit_event = liste_hit_event + [hit_event]
     
    # "DAMAGED" Event Type
    # T:194164 AType:2 DMG:0.0040 AID:1202220 TID:1178645 POS(280906.0000,5691.9624,145361.6250)
        Atype_2 = r"^T:(?P<tik>\d+) AType:2 DMG:(?P<damage>\S{5,6}) AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_2)
        match = regex.search(line)
        if match != None:
            damaged_event = Damaged_Event(match.group("tik"), match.group("damage"), match.group("attacker_id"), match.group("target_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_damaged_event = liste_damaged_event +[damaged_event]
     
    # "KILL" Event Type
    # T:203 AType:3 AID:-1 TID:220160 POS(225177.4063,12.3517,239741.1250)
        Atype_3 = r"^T:(?P<tik>\d+) AType:3 AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_3)
        match = regex.search(line)
        if match != None:
            kill_event = Kill_Event(match.group("tik"), match.group("attacker_id"), match.group("target_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_kill_event = liste_kill_event +[kill_event] 
     
    # "PLAYER END" Event Type
    # T:149016 AType:4 PLID:781354 PID:782378 BUL:2098 SH:0 BOMB:0 RCT:0 (241224.7031,56.4326,112470.3594)
        Atype_4 = r"^T:(?P<tik>\d+) AType:4 PLID:(?P<aircraft_id>\d+) PID:(?P<bot_id>\d+) BUL:(?P<cartridges>\d+) SH:(?P<shells>\d+) BOMB:(?P<bombs>\d+) RCT:(?P<rockets>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_4)
        match = regex.search(line)
        if match != None:
            player_end_event = Player_End_Event(match.group("tik"), match.group("aircraft_id"), match.group("bot_id"), match.group("cartridges"), match.group("shells"), match.group("bombs"), match.group("rockets"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_player_end_event = liste_player_end_event +[player_end_event] 
     
    # "TAKE OFF" Event Type
    # T:91410 AType:5 PID:780326 POS(258321.4219, 63.3613, 48782.1484)
        Atype_5 = r"^T:(?P<tik>\d+) AType:5 PID:(?P<aircraft_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_5)
        match = regex.search(line)
        if match != None:
            take_off_event = Take_Off_Event(match.group("tik"), match.group("aircraft_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_take_off_event = liste_take_off_event +[take_off_event] 
     
    # "LAND" Event Type
    # T:146520 AType:6 PID:781354 POS(241226.5000, 56.3776, 112472.2734)
        Atype_6 = r"^T:(?P<tik>\d+) AType:6 PID:(?P<aircraft_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_6)
        match = regex.search(line)
        if match != None:
            land_event = Land_Event(match.group("tik"), match.group("aircraft_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_land_event = liste_land_event +[land_event] 
     
    # "MISSION END" Event Type
    # T:450003 AType:7
        Atype_7 = r"^T:(?P<tik>\d+) AType:7.?$"
        regex = re.compile(Atype_7)
        match = regex.search(line)
        if match != None:
            mission_end_event = Mission_End_Event(match.group("tik"), )
     
    # "AIRFIELD" Event Type
    # T:10 AType:9 AID:39936 COUNTRY:101 POS(184785.5938, 2.6443, 240943.4375) IDS()
        Atype_9 = r"^T:(?P<tik>\d+) AType:9 AID:(?P<airfield_id>\d+) COUNTRY:(?P<country_id>\d{1,3}) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\) IDS\((?P<aircraft_id_list>[,\-\d]*)\)$"
        regex = re.compile(Atype_9)
        match = regex.search(line)
        if match != None:
            airfield_event = Airfield_Event(match.group("tik"), match.group("airfield_id"), match.group("country_id"), match.group("posx"), match.group("posy"), match.group("posz"), match.group("aircraft_id_list"))
            liste_airfield_event = liste_airfield_event +[airfield_event] 
     
    # "PLAYER PLANE" Event Type
    # T:68510 AType:10 PLID:700446 PID:701470 BUL:6450 SH:0 BOMB:6 RCT:0 (259973.9219,49.4752,54857.3555) IDS:34c54268-1f3f-4206-ad8f-5d3c0370bcc2 LOGIN:828dfc6b-8f3d-466e-ad09-d4901ff60abe NAME:player_name TYPE:Bf 110 G-2 COUNTRY:201 FORM:0 FIELD:573440 INAIR:2 PARENT:-1 ISPL:1 ISTSTART:1 PAYLOAD:2 FUEL:0.6500 SKIN:bf110g2/bf110g2_skin_13.dds WM:3 
        Atype_10 = r"^T:(?P<tik>\d+) AType:10 PLID:(?P<aircraft_id>\d+) PID:(?P<bot_id>\d+) BUL:(?P<cartridges>\d+) SH:(?P<shells>\d+) BOMB:(?P<bombs>\d+) RCT:(?P<rockets>\d+) \((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\) IDS:(?P<profile_id>[-\w]{36}) LOGIN:(?P<account_id>[-\w]{36}) NAME:(?P<name>.*) TYPE:(?P<aircraft_name>[\w\(\) .\-_/]+) COUNTRY:(?P<country_id>\d{1,3}) FORM:(?P<form>\d+) FIELD:(?P<airfield_id>\d+) INAIR:(?P<airstart>\d) PARENT:(?P<parent_id>[-\d]+) ISPL:(?P<is_player>\d+) ISTSTART:(?P<is_tracking_stat>\d+) PAYLOAD:(?P<payload_id>\d+) FUEL:(?P<fuel>\S{5,6}) SKIN:(?P<skin>[\S ]*) WM:(?P<weapon_mods_id>\d+)"
        regex = re.compile(Atype_10)
        match = regex.search(line)
        if match != None:
            player_plane_event = Player_Plane_Event(match.group("tik"), match.group("aircraft_id"), match.group("bot_id"), match.group("cartridges"), match.group("shells"), match.group("bombs"), match.group("rockets"), match.group("posx"), match.group("posy"), match.group("posz"), match.group("payload_id"), match.group("fuel"), match.group("weapon_mods_id"))
            liste_player_plane_event = liste_player_plane_event +[player_plane_event] 
     
        if line == "":
            break
     
     
     
    # Traitement affichage des logs d'évenements "HIT"
     
    n=0
    counter_hit = 0
    while n < len(liste_hit_event) :
        a = liste_hit_event[n]
        if getattr(a, "ammo") == "BULLET_GER_7-92x57_AP":
            counter_hit = counter_hit + 1
        n = n+1
    print ("HIT of BULLET_GER_7-92x57_AP:", counter_hit)
    Si cela vous semble correct, je vais continuer à traiter le regex pour l'ensemble des Atypes avant de voir plus en détail les affichages de statistiques souhaitées.

    A+

  15. #15
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Par défaut
    Re,

    J'ai fini le décryptage du fichier. Merci à tous !

    Maintenant, je dois traiter ces données.

    Je pense que la solution la plus simple serait d'exporter les données "avions" dans un fichier .csv ce qui permettrait facilement de faire des filtres etc...

    Est-il envisageable de:
    1) à partir des Atype=10 créer ma base avion avec l'ensemble des données correspondantes
    2) rajouter des informations actualisés, exemple les dommages dans une colonne spécifique du tableau; mais pour cela il faut que :
    a) je traite les informations dans un ordre logique (apparition => décolllage => éventuel dommage => appareil détruit /ou atterrissage => joueur quitte)
    b) je cherche la ligne correspondant à mon identifiant avion
    c) que je récupère la valeur stockée précédemment (exemple: si avion déjà endommagé à x%)
    d) que j'actualise cette valeur (x% + dommage supplémentaire = nouvelle valeur)

    Le module .csv est il envisageable pour ce que je veux faire ?

    Est-il conseillé pour débogage, lisibilité de le faire dans un programme à part ?

    Merci !

  16. #16
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Citation Envoyé par fabgenius Voir le message
    Re,

    J'ai fini le décryptage du fichier. Merci à tous !
    Présentes nous la solution pour laquelle tu as opté dans ce cas (il y a eu des mises à jour depuis ton dernier post, on ne peut pas les deviner) ! Ensuite on pourras peut-être répondre au mieux aux questions que tu te poses pour la suite, ou bien te dire de reprendre un peu car certaines choses ne vont pas.

    Le module csv, je ne vois pas trop pourquoi. Une fois que tu as tes données en python, tu fais tout en python ...

    Et ensuite tu n'ai pas obligé de faire des fichiers séparés, mais tu peux englober chacune de tes fonctionalités dans une fonction. Tu peux déjà commencé par englober dans une fonction le code qui permet, étant donné un nom de fichier, d'en extraire les données sous forme python (namedtuple, ou dictoinnaire, ou autre chose que tu as choisi comme structure de données)

  17. #17
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Par défaut
    Re,

    voici le code à jour:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    import re
    from collections import namedtuple
     
    ############################## DEFINITION LIST ##############################################################################################
     
    Init_Event = namedtuple("Init_Event", "tik, date")
    liste_init_event = []
    Hit_Event = namedtuple("Hit_Event", "tik, ammo, attacker_id, target_id")
    liste_hit_event = []
    Damaged_Event = namedtuple("Damaged_Event", "tik, damage, attacker_id, target_id, posx, posy, posz")
    liste_damaged_event = []
    Kill_Event = namedtuple("Kill_Event", "tik, attacker_id, target_id, posx, posy, posz")
    liste_kill_event = []
    Player_End_Event = namedtuple("Player_End_Event", "tik, aircraft_id, bot_id, cartridges, shells, bombs, rockets, posx, posy, posz")
    liste_player_end_event = []
    Take_Off_Event = namedtuple("Take_Off_Event", "tik, aircraft_id, posx, posy, posz")
    liste_take_off_event = []
    Land_Event = namedtuple("Land_Event", "tik, aircraft_id, posx, posy, posz")
    liste_land_event = []
    Mission_End_Event = namedtuple("Mission_End_Event", "tik, ")
    Airfield_Event = namedtuple("Airfield_Event", "tik, airfield_id, country_id, posx, posy, posz, aircraft_id_list")
    liste_airfield_event = []
    Player_Plane_Event = namedtuple("Player_Plane_Event", "tik, aircraft_id, bot_id, name, aircraft_name, country_id, airfield_id, cartridges, shells, bombs, rockets, posx, posy, posz, payload_id, fuel, weapon_mods_id")
    liste_player_plane_event = []
    Group_Init_Event = namedtuple("Group_Init_Event", "tik, group_id, members_id, leader_id")
    liste_group_init_event = []
    Object_Spawn_Event = namedtuple("Object_Spawn_Event", "tik, object_id, object_name, country_id, name, parent_id, posx, posy, posz")
    liste_object_spawn_event = []
    Influence_Aera_Event = namedtuple("Influence_Aera_Event", "tik, aera_id, country_id, enabled, in_air")
    liste_influence_aera_event = []
    Influence_Boundary_Event = namedtuple("Influence_Boundary_Event", "tik, aera_id, boundary")
    liste_influence_boundary_event = []
    Bot_Uninit_Event = namedtuple("Bot_Uninit_Event", "tik, bot_id, posx, posy, posz")
    liste_bot_uninit_event = []
    Position_Changed_Event = namedtuple("Position_Changed_Event", "tik, object_id, posx, posy, posz")
    liste_position_changed_event = []
    Bot_Leave_Event = namedtuple("Bot_Leave_Event", "tik, bot_id, parent_id, posx, posy, posz")
    liste_bot_leave_event = [] 
    liste = []
     
    ############################## CREATE LIST OF NAMEDTUPLE ##############################################################################################
     
    while 1:
        line = missionreport.readline()
     
    # "INITIAL" Event Type
    # T:0 AType:0 GDate:1943.11.2 GTime:15:45:0 MFile:Multiplayer/Kuban_4\Kuban_4_Welcome_to_crimea2.msnbin MID: GType:2 CNTRS:0:0,101:1,201:2 SETTS:000000000010000100000000110 MODS:0 PRESET:0 AQMID:0 ROUNDS: 1 POINTS: 5000
        Atype_0=  r"^T:(?P<tik>\d+) AType:0 GDate:(?P<date>\d{4}.\d{1,2}.\d{1,2}) GTime:\d{1,2}:\d{1,2}:\d{1,2} MFile:(?P<file_path>.+) MID:\d* GType:(?P<game_type_id>\d+) CNTRS:(?P<countries>[,:\d]+) SETTS:(?P<settings>\d+) MODS:(?P<mods>\d) PRESET:(?P<preset_id>\d)"
        regex = re.compile(Atype_0)
        match = regex.search(line)
        if match != None:           
            init_event = Init_Event(match.group("tik"), match.group("date"))
            liste_init_event = liste_init_event + [init_event]
     
    # "HIT" Event Type
    # T:130277 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
        Atype_1 = r"^T:(?P<tik>\d+) AType:1 AMMO:(?P<ammo>[-\w]+) AID:(?P<attacker_id>\d+) TID:(?P<target_id>\d+)$"
        regex = re.compile(Atype_1)
        match = regex.search(line)
        if match != None:
            hit_event = Hit_Event(match.group("tik"), match.group("ammo"), match.group("attacker_id"), match.group("target_id"))
            liste_hit_event = liste_hit_event + [hit_event]
     
    # "DAMAGED" Event Type
    # T:194164 AType:2 DMG:0.0040 AID:1202220 TID:1178645 POS(280906.0000,5691.9624,145361.6250)
        Atype_2 = r"^T:(?P<tik>\d+) AType:2 DMG:(?P<damage>\S{5,6}) AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_2)
        match = regex.search(line)
        if match != None:
            damaged_event = Damaged_Event(match.group("tik"), match.group("damage"), match.group("attacker_id"), match.group("target_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_damaged_event = liste_damaged_event +[damaged_event]
     
    # "KILL" Event Type
    # T:203 AType:3 AID:-1 TID:220160 POS(225177.4063,12.3517,239741.1250)
        Atype_3 = r"^T:(?P<tik>\d+) AType:3 AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_3)
        match = regex.search(line)
        if match != None:
            kill_event = Kill_Event(match.group("tik"), match.group("attacker_id"), match.group("target_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_kill_event = liste_kill_event +[kill_event] 
     
    # "PLAYER END" Event Type
    # T:149016 AType:4 PLID:781354 PID:782378 BUL:2098 SH:0 BOMB:0 RCT:0 (241224.7031,56.4326,112470.3594)
        Atype_4 = r"^T:(?P<tik>\d+) AType:4 PLID:(?P<aircraft_id>\d+) PID:(?P<bot_id>\d+) BUL:(?P<cartridges>\d+) SH:(?P<shells>\d+) BOMB:(?P<bombs>\d+) RCT:(?P<rockets>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_4)
        match = regex.search(line)
        if match != None:
            player_end_event = Player_End_Event(match.group("tik"), match.group("aircraft_id"), match.group("bot_id"), match.group("cartridges"), match.group("shells"), match.group("bombs"), match.group("rockets"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_player_end_event = liste_player_end_event +[player_end_event] 
     
    # "TAKE OFF" Event Type
    # T:91410 AType:5 PID:780326 POS(258321.4219, 63.3613, 48782.1484)
        Atype_5 = r"^T:(?P<tik>\d+) AType:5 PID:(?P<aircraft_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_5)
        match = regex.search(line)
        if match != None:
            take_off_event = Take_Off_Event(match.group("tik"), match.group("aircraft_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_take_off_event = liste_take_off_event +[take_off_event] 
     
    # "LAND" Event Type
    # T:146520 AType:6 PID:781354 POS(241226.5000, 56.3776, 112472.2734)
        Atype_6 = r"^T:(?P<tik>\d+) AType:6 PID:(?P<aircraft_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_6)
        match = regex.search(line)
        if match != None:
            land_event = Land_Event(match.group("tik"), match.group("aircraft_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_land_event = liste_land_event +[land_event] 
     
    # "MISSION END" Event Type
    # T:450003 AType:7
        Atype_7 = r"^T:(?P<tik>\d+) AType:7.?$"
        regex = re.compile(Atype_7)
        match = regex.search(line)
        if match != None:
            mission_end_event = Mission_End_Event(match.group("tik"), )
     
    # "AIRFIELD" Event Type
    # T:10 AType:9 AID:39936 COUNTRY:101 POS(184785.5938, 2.6443, 240943.4375) IDS()
        Atype_9 = r"^T:(?P<tik>\d+) AType:9 AID:(?P<airfield_id>\d+) COUNTRY:(?P<country_id>\d{1,3}) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\) IDS\((?P<aircraft_id_list>[,\-\d]*)\)$"
        regex = re.compile(Atype_9)
        match = regex.search(line)
        if match != None:
            airfield_event = Airfield_Event(match.group("tik"), match.group("airfield_id"), match.group("country_id"), match.group("posx"), match.group("posy"), match.group("posz"), match.group("aircraft_id_list"))
            liste_airfield_event = liste_airfield_event +[airfield_event] 
     
    # "PLAYER PLANE" Event Type
    # T:68510 AType:10 PLID:700446 PID:701470 BUL:6450 SH:0 BOMB:6 RCT:0 (259973.9219,49.4752,54857.3555) IDS:34c54268-1f3f-4206-ad8f-5d3c0370bcc2 LOGIN:828dfc6b-8f3d-466e-ad09-d4901ff60abe NAME:player_name TYPE:Bf 110 G-2 COUNTRY:201 FORM:0 FIELD:573440 INAIR:2 PARENT:-1 ISPL:1 ISTSTART:1 PAYLOAD:2 FUEL:0.6500 SKIN:bf110g2/bf110g2_skin_13.dds WM:3 
        Atype_10 = r"^T:(?P<tik>\d+) AType:10 PLID:(?P<aircraft_id>\d+) PID:(?P<bot_id>\d+) BUL:(?P<cartridges>\d+) SH:(?P<shells>\d+) BOMB:(?P<bombs>\d+) RCT:(?P<rockets>\d+) \((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\) IDS:(?P<profile_id>[-\w]{36}) LOGIN:(?P<account_id>[-\w]{36}) NAME:(?P<name>.*) TYPE:(?P<aircraft_name>[\w\(\) .\-_/]+) COUNTRY:(?P<country_id>\d{1,3}) FORM:(?P<form>\d+) FIELD:(?P<airfield_id>\d+) INAIR:(?P<airstart>\d) PARENT:(?P<parent_id>[-\d]+) ISPL:(?P<is_player>\d+) ISTSTART:(?P<is_tracking_stat>\d+) PAYLOAD:(?P<payload_id>\d+) FUEL:(?P<fuel>\S{5,6}) SKIN:(?P<skin>[\S ]*) WM:(?P<weapon_mods_id>\d+)"
        regex = re.compile(Atype_10)
        match = regex.search(line)
        if match != None:
            player_plane_event = Player_Plane_Event(match.group("tik"), match.group("aircraft_id"), match.group("bot_id"), match.group("name"), match.group("aircraft_name"), match.group("country_id"), match.group("airfield_id"), match.group("cartridges"), match.group("shells"), match.group("bombs"), match.group("rockets"), match.group("posx"), match.group("posy"), match.group("posz"), match.group("payload_id"), match.group("fuel"), match.group("weapon_mods_id"))
            liste_player_plane_event = liste_player_plane_event +[player_plane_event] 
     
    # "GROUP INIT" Event Type
    # T:1 AType:11 GID:115711 IDS:17407,26623,35839 LID:17407
        Atype_11 = r"^T:(?P<tik>\d+) AType:11 GID:(?P<group_id>\d+) IDS:(?P<members_id>[,\d]*) LID:(?P<leader_id>\d+)$"
        regex = re.compile(Atype_11)
        match = regex.search(line)
        if match != None:
            group_init_event = Group_Init_Event(match.group("tik"), match.group("group_id"), match.group("members_id"), match.group("leader_id"))
            liste_group_init_event = liste_group_init_event +[group_init_event] 
     
    # "OBJECT SPAWN" Event Type
    # T:203 AType:12 ID:220160 TYPE:dugout[32266,0] COUNTRY:201 NAME:Bunker PID:-1 POS(225177.4063,12.3517,239741.1250)
        Atype_12 = r"^T:(?P<tik>\d+) AType:12 ID:(?P<object_id>\d+) TYPE:(?P<object_name>[ .\'\-\w\(\)/]*)(\[-?\d+,-?\d+\])* COUNTRY:(?P<country_id>\d{1,3}) NAME:(?P<name>.*) PID:(?P<parent_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_12)
        match = regex.search(line)
        if match != None:
            object_spawn_event = Object_Spawn_Event(match.group("tik"), match.group("object_id"), match.group("object_name"), match.group("country_id"), match.group("name"), match.group("parent_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_object_spawn_event = liste_object_spawn_event +[object_spawn_event] 
     
    # "INFLUENCE AERA" Event Type
    # T:0 AType:13 AID:39936 COUNTRY:501 ENABLED:1 BC(0,0,0,0,0,0,0,0)
        Atype_13 = r"^T:(?P<tik>\d+) AType:13 AID:(?P<area_id>\d+) COUNTRY:(?P<country_id>\d{1,3}) ENABLED:(?P<enabled>\d) BC\((?P<in_air>[,\d]+)\)$"
        regex = re.compile(Atype_13)
        match = regex.search(line)
        if match != None:
            influence_aera_event = Influence_Aera_Event(match.group("tik"), match.group("aera_id"), match.group("country_id"), match.group("enabled"), match.group("in_air"))
            liste_influence_aera_event = liste_influence_aera_event +[influence_aera_event] 
     
    # "INFLUENCE BOUNDARY" Event Type
    # T:1 AType:14 AID:39936 BP((26968.0,74.3,22949.0),(30848.0,74.3,23891.0),(35717.0,74.3,23876.0),(55007.0,74.3,15026.0),
    # (55001.0,74.3,55020.0),(-5018.0,74.3,55042.0),(-4991.0,74.3,34620.0),(2552.0,74.3,34401.0),(8185.0,74.3,29341.0),
    # (17968.0,74.3,26690.0),(21055.0,74.3,27434.0),(22561.0,74.3,24669.0),(25287.6,74.3,24965.3))
        Atype_14 = r"^T:(?P<tik>\d+) AType:14 AID:(?P<area_id>\d+) BP(?P<boundary>[-,\(\)\.\d]+)$"
        regex = re.compile(Atype_14)
        match = regex.search(line)
        if match != None:
            influence_boundary_event = Influence_Boundary_Event(match.group("tik"), match.group("aera_id"), match.group("boundary"))
            liste_influence_boundary_event = liste_influence_boundary_event +[influence_boundary_event] 
     
    # "BOT UNINIT" Event Type
    # T:87224 AType:16 BOTID:993309 POS(0.0000,0.0000,0.0000)
        Atype_16 = r"^T:(?P<tik>\d+) AType:16 BOTID:(?P<bot_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_16)
        match = regex.search(line)
        if match != None:
            bot_uninit_event = Bot_Uninit_Event(match.group("tik"), match.group("bot_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_bot_uninit_event = liste_bot_uninit_event +[bot_uninit_event] 
     
    # "POSITION CHANGED" Event Type
    # T:58 AType:17 ID:107519 POS(39013.016,45.535,16807.107)
        Atype_17 = r"^T:(?P<tik>\d+) AType:17 ID:(?P<object_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_17)
        match = regex.search(line)
        if match != None:
            position_changed_event = Position_Changed_Event(match.group("tik"), match.group("object_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_position_changed_event = liste_position_changed_event +[position_changed_event] 
     
    # "BOT LEAVE" Event Type (Eject ??)
    # T:168858 AType:18 BOTID:1204267 PARENTID:1203243 POS(277889.3750,6450.9058,129604.6172)
        Atype_18 = r"^T:(?P<tik>\d+) AType:18 BOTID:(?P<bot_id>\d+) PARENTID:(?P<parent_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
        regex = re.compile(Atype_18)
        match = regex.search(line)
        if match != None:
            bot_leave_event = Bot_Leave_Event(match.group("tik"), match.group("bot_id"), match.group("parent_id"), match.group("posx"), match.group("posy"), match.group("posz"))
            liste_bot_leave_event = liste_bot_leave_event +[bot_leave_event]
     
        if line == "":
            break

    Pourquoi CSV, c'est que je pensais que cela serait plus simple pour faire des tableaux croisés en sélectionnant par exemple en ligne les types d'avions, en colonnes les pays et en valeurs les munitions utilisées ou le nombre d'avion détruit, etc...
    Sur un CSV cela se fait assez rapidement si on a un fichier avec l'ensemble des données mais je ne suis pas contre de le faire en complet sur Python mais je ne sais pas si j'en ai les compétences

    Mais je serais ravis d'avoir de vos conseils.

    Cordialement

  18. #18
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Bon alors en l'état ce code est impossible à maintenir et à faire évoluer. Je vais devoir te faire passer par une phase de factorisation (il faut éviter de dupliquer du code !) avant de pouvoir aller plus loin avec de nouvelles fonctionalités.

    On t'a suggérer les namedtuple parcequ'au départ ca semblaient bien s'y prêter. Là vu la diversité des choses que tu manipules tu as plus d'avantages à garder des dictionnaires je pense. Ca te permettra de pouvoir faire des opérations génériques (c'est à dire écrire du code valable quelquesoit l'event, et pas un code pour chaque event).

    Donc au lieu d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Init_Event = namedtuple("Init_Event", "tik, date")
    init_event = Init_Event(match.group("tik"), match.group("date"))
    tu aurais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    init_event = { "tik" : match.group("tik"), "date": match.group("date") }
    et plus besoin de se définir des nouveaux types au passage


    Donc peux tu réécrire ton code en commencant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    EventsKeywords = { 
        "init"   : ["tik", "date"] ,
        "hit"    : ["tik", "ammo", "attacker_id", "target_id"], 
        "damaged": ["tik", "damage", "attacker_id", "target_id", "posx", "posy", "posz"] , 
        "kill"   : ["tik", "attacker_id", "target_id", "posx", "posy", "posz"],
    #### A completer
        }
     
    AllEvents = { k : [] for k in EventsKeywords.keys() }
    AllEvents contient tous les events, classifier par type d'event. Ca regroupe toutes tes liste_blabla_event, pareil classé par type d'event.
    Lorsque tu créés un nouvel objet pour l'ajouter à tous les events, voici ce que ca pourrais donner donc, en s'appuyant sur la variable contenant tous les mots clés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    kill_event = Kill_Event(match.group("tik"), match.group("attacker_id"), match.group("target_id"), match.group("posx"), match.group("posy"), match.group("posz"))
    liste_kill_event = liste_kill_event +[kill_event]
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    kill_event = { k:match.group(k) for k in EventsKeywords["kill"] }
    AllEvents["kill"].append(kill_event)
    Désolé de t'en faire passer par là, mais réécriture indispensable pour pouvoir continuer à avancer.

    PS : Avant de te lancer dans la réécriture, fais une sauvegarde de ton code quelque part sur ton ordi !

  19. #19
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    une réécriture parmi d'autres façons de faire:

    note: la regex 4 (PLAYER END) semble fausse, il y a un 'POS' manquant ou en trop à la fin juste avant la parenthèse

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    import re
     
    liste_init_event                 = []  # 0 - INITIAL
    liste_hit_event                  = []  # 1 - HIT
    liste_damaged_event              = []  # 2 - DAMAGED
    liste_kill_event                 = []  # 3 - KILL
    liste_player_end_event           = []  # 4 - PLAYER END
    liste_take_off_event             = []  # 5 - TAKE OFF
    liste_land_event                 = []  # 6 - LAND
    liste_airfield_event             = []  # 7 - AIRFIELD
     
    liste_player_plane_event         = []  # 9 - PLAYER PLANE
    liste_mission_end_event          = []  # 10 - MISSION END
    liste_group_init_event           = []  # 11 - GROUP INIT
    liste_object_spawn_event         = []  # 12 - OBJECT SPAWN
    liste_influence_aera_event       = []  # 13 - INFLUENCE AREA
    liste_influence_boundary_event   = []  # 14 - INFLUENCE BOUNDARY
     
    liste_bot_uninit_event           = []  # 16 - BOT UNINIT
    liste_position_changed_event     = []  # 17 - POSITION CHANGED
    liste_bot_leave_event            = []  # 18 - BOT LEAVE
     
    liste_all_events                 = []
     
    atype_regex = re.compile('AType:(\d+)')  # regex appliquée à chaque ligne, chaque ligne comporte un AType on en est sûr.
    dwh = [   # ...et en fonction du AType on sélectionnera la bonne regex à appliquer
       {  'description'  : 'INITIAL',
          'liste'        : liste_init_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>0) GDate:(?P<date>\d{4}.\d{1,2}.\d{1,2}) GTime:\d{1,2}:\d{1,2}:\d{1,2} MFile:(?P<file_path>.+) MID:\d* GType:(?P<game_type_id>\d+) CNTRS:(?P<countries>[,:\d]+) SETTS:(?P<settings>\d+) MODS:(?P<mods>\d) PRESET:(?P<preset_id>\d)")
       },
       {  'description'  : 'HIT',
          'liste'        : liste_hit_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>1) AMMO:(?P<ammo>[-\w]+) AID:(?P<attacker_id>\d+) TID:(?P<target_id>\d+)$")
       },
       {  'description'  : 'DAMAGED',
          'liste'        : liste_damaged_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>2) DMG:(?P<damage>\S{5,6}) AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       },
       {  'description'  : 'KILL',
          'liste'        : liste_kill_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>3) AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       },
       {  'description'  : 'PLAYER END',
          'liste'        : liste_player_end_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>4) PLID:(?P<aircraft_id>\d+) PID:(?P<bot_id>\d+) BUL:(?P<cartridges>\d+) SH:(?P<shells>\d+) BOMB:(?P<bombs>\d+) RCT:(?P<rockets>\d+) \((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       },
       {  'description'  : 'TAKE OFF',
          'liste'        : liste_take_off_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>5) PID:(?P<aircraft_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       },
       {  'description'  : 'LAND',
          'liste'        : liste_land_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>6) PID:(?P<aircraft_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       },
       {  'description'  : 'MISSION END',
          'liste'        : liste_mission_end_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>7).?$")
       },
       {  'description'  : 'event type #8',
          'liste'        : None,
          'regex'        : None
       },
       {  'description'  : 'AIRFIELD',
          'liste'        : liste_airfield_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>9) AID:(?P<airfield_id>\d+) COUNTRY:(?P<country_id>\d{1,3}) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\) IDS\((?P<aircraft_id_list>[,\-\d]*)\)$")
       },
       {  'description'  : 'PLAYER PLANE',
          'liste'        : liste_player_plane_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>10) PLID:(?P<aircraft_id>\d+) PID:(?P<bot_id>\d+) BUL:(?P<cartridges>\d+) SH:(?P<shells>\d+) BOMB:(?P<bombs>\d+) RCT:(?P<rockets>\d+) \((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\) IDS:(?P<profile_id>[-\w]{36}) LOGIN:(?P<account_id>[-\w]{36}) NAME:(?P<name>.*) TYPE:(?P<aircraft_name>[\w\(\) .\-_/]+) COUNTRY:(?P<country_id>\d{1,3}) FORM:(?P<form>\d+) FIELD:(?P<airfield_id>\d+) INAIR:(?P<airstart>\d) PARENT:(?P<parent_id>[-\d]+) ISPL:(?P<is_player>\d+) ISTSTART:(?P<is_tracking_stat>\d+) PAYLOAD:(?P<payload_id>\d+) FUEL:(?P<fuel>\S{5,6}) SKIN:(?P<skin>[\S ]*) WM:(?P<weapon_mods_id>\d+)")
       },
       {  'description'  : 'GROUP INIT',
          'liste'        : liste_group_init_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>11) GID:(?P<group_id>\d+) IDS:(?P<members_id>[,\d]*) LID:(?P<leader_id>\d+)$")
       },
       {  'description'  : 'OBJECT SPAWN',
          'liste'        : liste_object_spawn_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>12) ID:(?P<object_id>\d+) TYPE:(?P<object_name>[ .\'\-\w\(\)/]*)(\[-?\d+,-?\d+\])* COUNTRY:(?P<country_id>\d{1,3}) NAME:(?P<name>.*) PID:(?P<parent_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       },
       {  'description'  : 'INFLUENCE AREA',
          'liste'        : liste_influence_aera_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>13) AID:(?P<area_id>\d+) COUNTRY:(?P<country_id>\d{1,3}) ENABLED:(?P<enabled>\d) BC\((?P<in_air>[,\d]+)\)$")
       },
       {  'description'  : 'INFLUENCE BOUNDARY',
          'liste'        : liste_influence_boundary_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>14) AID:(?P<area_id>\d+) BP(?P<boundary>[-,\(\)\.\d]+)$")
       },
       {  'description'  : 'event type #15',
          'liste'        : None,
          'regex'        : None
       },
       {  'description'  : 'BOT UNINIT',
          'liste'        : liste_bot_uninit_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>16) BOTID:(?P<bot_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       },
       {  'description'  : 'POSITION CHANGED',
          'liste'        : liste_position_changed_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>17) ID:(?P<object_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       },
       {  'description'  : 'BOT LEAVE',
          'liste'        : liste_bot_leave_event,
          'regex'        : re.compile(r"^T:(?P<tik>\d+) AType:(?P<AType>18) BOTID:(?P<bot_id>\d+) PARENTID:(?P<parent_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
       }
    ]
     
    with open('fichier.txt') as missionreport:
       for line in missionreport:
          if line.startswith('#'):   # on zappe les commentaires dans le fichier qu'on lit
             continue
          atype = int(atype_regex.search(line).group(1))
          if atype in (8, 15):       # si AType == 8 ou Atype == 15, on passe à la ligne suivante
             continue
          reg = dwh[atype]['regex'].match(line)
          resultat = reg.groupdict() # tadaa...
          dwh[atype]['liste'].append(resultat)
          liste_all_events.append(resultat)
    le code a été testé contre ce fichier (sur la base des commentaires plus haut ) :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # "INITIAL" Event Type
    T:0 AType:0 GDate:1943.11.2 GTime:15:45:0 MFile:Multiplayer/Kuban_4\Kuban_4_Welcome_to_crimea2.msnbin MID: GType:2 CNTRS:0:0,101:1,201:2 SETTS:000000000010000100000000110 MODS:0 PRESET:0 AQMID:0 ROUNDS: 1 POINTS: 5000
    # "HIT" Event Type
    T:130277 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
    # "DAMAGED" Event Type
    T:194164 AType:2 DMG:0.0040 AID:1202220 TID:1178645 POS(280906.0000,5691.9624,145361.6250)
    # "KILL" Event Type
    T:203 AType:3 AID:-1 TID:220160 POS(225177.4063,12.3517,239741.1250)
    # "PLAYER END" Event Type
    T:149016 AType:4 PLID:781354 PID:782378 BUL:2098 SH:0 BOMB:0 RCT:0 (241224.7031,56.4326,112470.3594)
    # "TAKE OFF" Event Type
    T:91410 AType:5 PID:780326 POS(258321.4219, 63.3613, 48782.1484)
    # "LAND" Event Type
    T:146520 AType:6 PID:781354 POS(241226.5000, 56.3776, 112472.2734)
    # "MISSION END" Event Type
    T:450003 AType:7
    # "AIRFIELD" Event Type
    T:10 AType:9 AID:39936 COUNTRY:101 POS(184785.5938, 2.6443, 240943.4375) IDS()
    # "PLAYER PLANE" Event Type
    T:68510 AType:10 PLID:700446 PID:701470 BUL:6450 SH:0 BOMB:6 RCT:0 (259973.9219,49.4752,54857.3555) IDS:34c54268-1f3f-4206-ad8f-5d3c0370bcc2 LOGIN:828dfc6b-8f3d-466e-ad09-d4901ff60abe NAME:player_name TYPE:Bf 110 G-2 COUNTRY:201 FORM:0 FIELD:573440 INAIR:2 PARENT:-1 ISPL:1 ISTSTART:1 PAYLOAD:2 FUEL:0.6500 SKIN:bf110g2/bf110g2_skin_13.dds WM:3 
    # "GROUP INIT" Event Type
    T:1 AType:11 GID:115711 IDS:17407,26623,35839 LID:17407
    # "OBJECT SPAWN" Event Type
    T:203 AType:12 ID:220160 TYPE:dugout[32266,0] COUNTRY:201 NAME:Bunker PID:-1 POS(225177.4063,12.3517,239741.1250)
    # "INFLUENCE AERA" Event Type
    T:0 AType:13 AID:39936 COUNTRY:501 ENABLED:1 BC(0,0,0,0,0,0,0,0)
    # "INFLUENCE BOUNDARY" Event Type
    T:1 AType:14 AID:39936 BP((26968.0,74.3,22949.0),(30848.0,74.3,23891.0),(35717.0,74.3,23876.0),(55007.0,74.3,15026.0),(55001.0,74.3,55020.0),(-5018.0,74.3,55042.0),(-4991.0,74.3,34620.0),(2552.0,74.3,34401.0),(8185.0,74.3,29341.0),(17968.0,74.3,26690.0),(21055.0,74.3,27434.0),(22561.0,74.3,24669.0),(25287.6,74.3,24965.3))
    # "BOT UNINIT" Event Type
    T:87224 AType:16 BOTID:993309 POS(0.0000,0.0000,0.0000)
    # "POSITION CHANGED" Event Type
    T:58 AType:17 ID:107519 POS(39013.016,45.535,16807.107)
    # "BOT LEAVE" Event Type (Eject ??)
    T:168858 AType:18 BOTID:1204267 PARENTID:1203243 POS(277889.3750,6450.9058,129604.6172)
    note qu'on est pas obligé d'avoir une forêt de listes, une seule liste globale suffirait amplement, par exemple liste_hit_event correspondrait simplement à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [i for i in liste_all_events if i['AType'] == '1']
    on pourrait alors se contenter d'une simple liste de regex compilées (là on a une liste de dictionnaires)

    et du coup on a facilement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    counter_hits = len([i for i in liste_hit_event if i['ammo'] == 'BULLET_GER_7-92x57_AP'])
    #  ou encore
    counter_hits = len([i for i in liste_all_events if i['AType'] == '1' and i['ammo'] == 'BULLET_GER_7-92x57_AP'])

  20. #20
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Par défaut
    Re,

    Merci pour vos aides respectives.

    J'avais commencé à reprendre le code dans le format le plus proche de celui initial en le reformatant en une fonction comme proposé plus haut.

    J'arrive à cela:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    def extraction (namefile):
        """Extraction of mission report files from IL2 Great Battles.
        The mission report are store in dictionnary by Event Type"""
     
    # Import modules
        import re
     
     
    # Open mission report file
        try :
            missionreport = open(namefile, "r")
            print ("Report mission file will be loaded")
        except:
            print ("The mission report are not found ")
     
    # Dictionnary of keywords
        EventsKeywords = { 
            "init"  :   ["tik", "date"] ,
            "hit"   :   ["tik", "ammo", "attacker_id", "target_id"], 
            "damaged":  ["tik", "damage", "attacker_id", "target_id", "posx", "posy", "posz"], 
            "kill"  :   ["tik", "attacker_id", "target_id", "posx", "posy", "posz"],
            "player_end":["tik", "aircraft_id", "bot_id", "cartridges", "shells", "bombs", 
                        "rockets", "posx", "posy", "posz"],
            "take_off": ["tik", "aircraft_id", "posx", "posy", "posz"],
            "land"  :   ["tik", "aircraft_id", "posx", "posy", "posz"],
            "end"   :   ["tik"],
            "objective":["tik", "object_id", "pos", "coal_id", "task_type_id", "success", 
                        "icon_type_id"],
            "airfield": ["tik", "airfield_id", "country_id", "posx", "posy", "posz", 
                        "aircraft_id_list"],
            "plane" :   ["tik", "aircraft_id", "bot_id", "cartridges", "shells", "bombs", 
                        "rockets", "posx", "posy", "posz", "profile_id", "account_id", "name", 
                        "aircraft_name", "country_id", "form","airfield_id", "airstart", 
                        "parent_id", "is_player", "payload_id", "fuel", "skin", "weapon_mods_id"],
            "group" :   ["tik", "group_id", "members_id", "leader_id"],
            "object":   ["tik", "object_id", "object_name", "country_id", "name", "parent_id", 
                        "posx", "posy", "posz"],
            "influence":["tik", "aera_id", "country_id", "enabled", "in_air"],
            "boundary" :["tik, aera_id, boundary"],
            "bot_uninit":["tik", "bot_id", "posx", "posy", "posz"],
            "position" :["tik", "object_id", "posx", "posy", "posz"],
            "bot_leave":["tik", "bot_id", "parent_id", "posx", "posy", "posz"],
            "tour"  :   ["tik"],
            "join"  :   ["tik", "account_id", "profile_id"],
            "exit"  :   ["tik", "account_id", "profile_id"],
            "tank"  :   ["tik", "parent_id", "posx", "posy", "posz"]
            }
     
        AllEvents = { k : [] for k in EventsKeywords.keys() }   
     
    # Read mission report file line after line
        while 1:
            line = missionreport.readline()
     
    # Collect regex group by Atype
     
    # "INITIAL" Event Type (AType:0)
    # T:0 AType:0 GDate:1943.11.2 GTime:15:45:0 
    # MFile:Multiplayer/Kuban_4\Kuban_4_Welcome_to_crimea2.msnbin MID: 
    # GType:2 CNTRS:0:0,101:1,201:2
    # SETTS:000000000010000100000000110 MODS:0 PRESET:0 AQMID:0 ROUNDS: 1 POINTS: 5000
            Atype_0= r"^T:(?P<tik>\d+) AType:0 GDate:(?P<date>\d{4}.\d{1,2}.\d{1,2}) GTime:\d{1,2}:\d{1,2}:\d{1,2} MFile:(?P<file_path>.+) MID:\d* GType:(?P<game_type_id>\d+) CNTRS:(?P<countries>[,:\d]+) SETTS:(?P<settings>\d+) MODS:(?P<mods>\d) PRESET:(?P<preset_id>\d)"
            regex = re.compile(Atype_0)
            match= regex.search(line)
            if match != None:           
                init_event = { k:match.group(k) for k in EventsKeywords["init"] }
                AllEvents["init"].append(init_event)
     
    # "HIT" Event Type (AType:1)
    # T:130277 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
            Atype_1= r"^T:(?P<tik>\d+) AType:1 AMMO:(?P<ammo>[-\w]+) AID:(?P<attacker_id>\d+) TID:(?P<target_id>\d+)$"
            regex = re.compile(Atype_1)
            match = regex.search(line)
            if match != None:
                hit_event = { k:match.group(k) for k in EventsKeywords["hit"] }
                AllEvents["hit"].append(hit_event)
     
    # "DAMAGED" Event Type (AType:2)
    # T:194164 AType:2 DMG:0.0040 AID:1202220 TID:1178645 POS(280906.0000,5691.9624,145361.6250)
            Atype_2= r"^T:(?P<tik>\d+) AType:2 DMG:(?P<damage>\S{5,6}) AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_2)
            match = regex.search(line)
            if match != None:
                damaged_event = { k:match.group(k) for k in EventsKeywords["damaged"] }
                AllEvents["damaged"].append(damaged_event)
     
    # "KILL" Event Type (AType:3)
    # T:203 AType:3 AID:-1 TID:220160 POS(225177.4063,12.3517,239741.1250)
            Atype_3 = r"^T:(?P<tik>\d+) AType:3 AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_3)
            match = regex.search(line)
            if match != None:
                kill_event = { k:match.group(k) for k in EventsKeywords["kill"] }
                AllEvents["kill"].append(kill_event)
     
    # "PLAYER END" Event Type (AType:4)
    # T:149016 AType:4 PLID:781354 PID:782378 BUL:2098 SH:0 BOMB:0 RCT:0 (241224.7031,56.4326,112470.3594)
            Atype_4 = r"^T:(?P<tik>\d+) AType:4 PLID:(?P<aircraft_id>\d+) PID:(?P<bot_id>\d+) BUL:(?P<cartridges>\d+) SH:(?P<shells>\d+) BOMB:(?P<bombs>\d+) RCT:(?P<rockets>\d+) \((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_4)
            match = regex.search(line)
            if match != None:
                player_end_event = { k:match.group(k) for k in EventsKeywords["player_end"] }
                AllEvents["player_end"].append(player_end_event)       
     
    # "TAKE OFF" Event Type (AType:5)
    # T:91410 AType:5 PID:780326 POS(258321.4219, 63.3613, 48782.1484)
            Atype_5 = r"^T:(?P<tik>\d+) AType:5 PID:(?P<aircraft_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_5)
            match = regex.search(line)
            if match != None:
                take_off_event = { k:match.group(k) for k in EventsKeywords["take_off"] }
                AllEvents["take_off"].append(take_off_event)   
     
    # "LAND" Event Type (AType:6)
    # T:146520 AType:6 PID:781354 POS(241226.5000, 56.3776, 112472.2734)
            Atype_6 = r"^T:(?P<tik>\d+) AType:6 PID:(?P<aircraft_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_6)
            match = regex.search(line)
            if match != None:
                land_event = { k:match.group(k) for k in EventsKeywords["land"] }
                AllEvents["land"].append(land_event)   
     
    # "MISSION END" Event Type (AType:7)
    # T:450003 AType:7
            Atype_7 = r"^T:(?P<tik>\d+) AType:7.?$"
            regex = re.compile(Atype_7)
            match = regex.search(line)
            if match != None:
                end_event = { k:match.group(k) for k in EventsKeywords["end"] }
                AllEvents["end"].append(end_event)   
     
    # "MISSION OBJECTIVE" Event Type (AType:8)
    # T:3745 AType:8 OBJID:102 POS(37286.734,0.000,18839.822) COAL:1 TYPE:0 RES:1 ICTYPE:0
            Atype_8 = r"^T:(?P<tik>\d+) AType:8 OBJID:(?P<object_id>\d+) POS\((?P<pos>.+)\) COAL:(?P<coal_id>\d) TYPE:(?P<task_type_id>\d+) RES:(?P<success>\d) ICTYPE:(?P<icon_type_id>[\-\d]+)$"
            regex = re.compile(Atype_8)
            match = regex.search(line)
            if match != None:
                objective_event = { k:match.group(k) for k in EventsKeywords["objective"] }
                AllEvents["objective"].append(objective_event) 
     
    # "AIRFIELD" Event Type (AType:9)
    # T:10 AType:9 AID:39936 COUNTRY:101 POS(184785.5938, 2.6443, 240943.4375) IDS()
            Atype_9 = r"^T:(?P<tik>\d+) AType:9 AID:(?P<airfield_id>\d+) COUNTRY:(?P<country_id>\d{1,3}) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\) IDS\((?P<aircraft_id_list>[,\-\d]*)\)$"
            regex = re.compile(Atype_9)
            match = regex.search(line)
            if match != None:
                airfield_event = { k:match.group(k) for k in EventsKeywords["airfield"] }
                AllEvents["airfield"].append(airfield_event) 
     
    # "PLAYER PLANE" Event Type (AType:10)
    # T:68510 AType:10 PLID:700446 PID:701470 BUL:6450 SH:0 BOMB:6 RCT:0 
    #(259973.9219,49.4752,54857.3555) IDS:34c54268-1f3f-4206-ad8f-5d3c0370bcc2
    # LOGIN:828dfc6b-8f3d-466e-ad09-d4901ff60abe NAME:player_name TYPE:Bf 110 G-2 COUNTRY:201 
    # FORM:0 FIELD:573440 INAIR:2 PARENT:-1 ISPL:1 ISTSTART:1 PAYLOAD:2 FUEL:0.6500
    # SKIN:bf110g2/bf110g2_skin_13.dds WM:3 
            Atype_10 = r"^T:(?P<tik>\d+) AType:10 PLID:(?P<aircraft_id>\d+) PID:(?P<bot_id>\d+) BUL:(?P<cartridges>\d+) SH:(?P<shells>\d+) BOMB:(?P<bombs>\d+) RCT:(?P<rockets>\d+) \((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\) IDS:(?P<profile_id>[-\w]{36}) LOGIN:(?P<account_id>[-\w]{36}) NAME:(?P<name>.*) TYPE:(?P<aircraft_name>[\w\(\) .\-_/]+) COUNTRY:(?P<country_id>\d{1,3}) FORM:(?P<form>\d+) FIELD:(?P<airfield_id>\d+) INAIR:(?P<airstart>\d) PARENT:(?P<parent_id>[-\d]+) ISPL:(?P<is_player>\d+) ISTSTART:(?P<is_tracking_stat>\d+) PAYLOAD:(?P<payload_id>\d+) FUEL:(?P<fuel>\S{5,6}) SKIN:(?P<skin>[\S ]*) WM:(?P<weapon_mods_id>\d+)"
            regex = re.compile(Atype_10)
            match = regex.search(line)
            if match != None:
                plane_event = { k:match.group(k) for k in EventsKeywords["plane"] }
                AllEvents["plane"].append(plane_event) 
     
    # "GROUP INIT" Event Type (AType:11)
    # T:1 AType:11 GID:115711 IDS:17407,26623,35839 LID:17407
            Atype_11 = r"^T:(?P<tik>\d+) AType:11 GID:(?P<group_id>\d+) IDS:(?P<members_id>[,\d]*) LID:(?P<leader_id>\d+)$"
            regex = re.compile(Atype_11)
            match = regex.search(line)
            if match != None:
                group_event = { k:match.group(k) for k in EventsKeywords["group"] }
                AllEvents["group"].append(group_event)
     
    # "OBJECT SPAWN" Event Type (AType:12)
    # T:203 AType:12 ID:220160 TYPE:dugout[32266,0] COUNTRY:201 NAME:Bunker PID:-1 POS(225177.4063,12.3517,239741.1250)
            Atype_12 = r"^T:(?P<tik>\d+) AType:12 ID:(?P<object_id>\d+) TYPE:(?P<object_name>[ .\'\-\w\(\)/]*)(\[-?\d+,-?\d+\])* COUNTRY:(?P<country_id>\d{1,3}) NAME:(?P<name>.*) PID:(?P<parent_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_12)
            match = regex.search(line)
            if match != None:
                object_event = { k:match.group(k) for k in EventsKeywords["object"] }
                AllEvents["object"].append(object_event)
     
    # "INFLUENCE AERA" Event Type (AType:13)
    # T:0 AType:13 AID:39936 COUNTRY:501 ENABLED:1 BC(0,0,0,0,0,0,0,0)
            Atype_13 = r"^T:(?P<tik>\d+) AType:13 AID:(?P<area_id>\d+) COUNTRY:(?P<country_id>\d{1,3}) ENABLED:(?P<enabled>\d) BC\((?P<in_air>[,\d]+)\)$"
            regex = re.compile(Atype_13)
            match = regex.search(line)
            if match != None:
                influence_event = { k:match.group(k) for k in EventsKeywords["influence"] }
                AllEvents["influence"].append(influence_event)
     
    # "INFLUENCE BOUNDARY" Event Type (AType:14)
    # T:1 AType:14 AID:39936 BP((26968.0,74.3,22949.0),(30848.0,74.3,23891.0),(35717.0,74.3,23876.0),(55007.0,74.3,15026.0),
    # (55001.0,74.3,55020.0),(-5018.0,74.3,55042.0),(-4991.0,74.3,34620.0),(2552.0,74.3,34401.0),(8185.0,74.3,29341.0),
    # (17968.0,74.3,26690.0),(21055.0,74.3,27434.0),(22561.0,74.3,24669.0),(25287.6,74.3,24965.3))
            Atype_14 = r"^T:(?P<tik>\d+) AType:14 AID:(?P<area_id>\d+) BP(?P<boundary>[-,\(\)\.\d]+)$"
            regex = re.compile(Atype_14)
            match = regex.search(line)
            if match != None:
                boundary_event = { k:match.group(k) for k in EventsKeywords["boundary"] }
                AllEvents["boundary"].append(boundary_event)
     
    # "LOG VERSION" Event Type (AType:15)
    # T:0 AType:15 VER:17
     
     
    # "BOT UNINIT" Event Type (AType:16)
    # T:87224 AType:16 BOTID:993309 POS(0.0000,0.0000,0.0000)
            Atype_16 = r"^T:(?P<tik>\d+) AType:16 BOTID:(?P<bot_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_16)
            match = regex.search(line)
            if match != None:
                bot_uninit_event = { k:match.group(k) for k in EventsKeywords["bot_uninit"] }
                AllEvents["bot_uninit"].append(bot_uninit_event)
     
    # "POSITION CHANGED" Event Type (AType:17)
    # T:58 AType:17 ID:107519 POS(39013.016,45.535,16807.107)
            Atype_17 = r"^T:(?P<tik>\d+) AType:17 ID:(?P<object_id>\d+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_17)
            match = regex.search(line)
            if match != None:
                position_event = { k:match.group(k) for k in EventsKeywords["position"] }
                AllEvents["position"].append(position_event)
     
    # "BOT LEAVE" Event Type (Eject ??) (AType:18)
    # T:168858 AType:18 BOTID:1204267 PARENTID:1203243 POS(277889.3750,6450.9058,129604.6172)
            Atype_18 = r"^T:(?P<tik>\d+) AType:18 BOTID:(?P<bot_id>\d+) PARENTID:(?P<parent_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_18)
            match = regex.search(line)
            if match != None:
                bot_leave_event = { k:match.group(k) for k in EventsKeywords["bot_leave"] }
                AllEvents["bot_leave"].append(bot_leave_event)
     
    # "END OF THE TOUR" Event Type (AType:19)
    # T:706771 AType:19
            Atype_19 = r"^T:(?P<tik>\d+) AType:19$"
            regex = re.compile(Atype_19)
            match = regex.search(line)
            if match != None:
                tour_event = { k:match.group(k) for k in EventsKeywords["tour"] }
                AllEvents["tour"].append(tour_event)
     
    # "JOIN PLAYER" Event Type (AType:20)
    # T:0 AType:20 USERID:52c04d8d-4616-4840-8648-dd9e9da4570a USERNICKID:de8bec6d-a6a0-42dd-945d-3804689a1dd5
            Atype_20 = r"^T:(?P<tik>\d+) AType:20 USERID:(?P<account_id>[-\w]{36}) USERNICKID:(?P<profile_id>[-\w]{36})$"
            regex = re.compile(Atype_20)
            match = regex.search(line)
            if match != None:
                join_event = { k:match.group(k) for k in EventsKeywords["join"] }
                AllEvents["join"].append(join_event)
     
    # "EXIT PLAYER" Event Type (AType:21)
    # T:18573 AType:21 USERID:d5bc9e4c-055c-46c2-8ace-8a7daa9eed4a USERNICKID:e608236e-332a-4843-8421-8e013c59685f
            Atype_21 = r"^T:(?P<tik>\d+) AType:21 USERID:(?P<account_id>[-\w]{36}) USERNICKID:(?P<profile_id>[-\w]{36})$"
            regex = re.compile(Atype_21)
            match = regex.search(line)
            if match != None:
                exit_event = { k:match.group(k) for k in EventsKeywords["exit"] }
                AllEvents["exit"].append(exit_event)
     
    # "TANK EVENT (??)"  Event Type (AType:22)
    # T:36160 AType:22 PID:1684580 POS(223718.406, 10.337, 242309.250)
            Atype_22 = r"^T:(?P<tik>\d+) AType:22 PID:(?P<parent_id>[-\d]+) POS\((?P<posx>\d+\.\d+)\, ?(?P<posy>\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$"
            regex = re.compile(Atype_22)
            match = regex.search(line)
            if match != None:
                tank_event = { k:match.group(k) for k in EventsKeywords["tank"] }
                AllEvents["tank"].append(tank_event)
     
    # End of collect mission report            
            if line == "":
                print ("All events are loaded")
                print (AllEvents)
                break
    Je reconnais que la dernière solution proposée est plus dense et évite de reprendre les mots clefs dans la définition des clefs de dictionnaire.

    Pour être sûr de bien comprendre voici ce que je déduis de votre code (je suis novice):

    - A la ligne 25 atype_regex = re.compile('AType:(\d+)') => on commence par définir un regex des Atype
    - A la ligne 26 on crée une chaîne de dictionnaire des "Atype" à traiter
    - A la ligne 109 atype = int(atype_regex.search(line).group(1)) => si je comprends bien avec les attributs de la fonction vous demandez de chercher ligne par ligne la correspondance du Atype (1er groupe regex du Atype, le seul d'ailleurs) que vous convertisser en int
    - A la ligne 112 reg = dwh[atype]['regex'].match(line) => là je suis un peu perdu... j'en déduis que c'est le regex va appliquer la procédure décrite dans la ligne "regex" (chaîne de la ligne 26) en fonction de son rang (Atype_0 => donc 1er élément de la chaîne) ?
    - A la ligne 113 resultat = reg.groupdict() => grâce à l'attribut de la fonction vous nommez vos clefs en fonction des sous-groupes regex
    - A la ligne 114 dwh[atype]['liste'].append(resultat) => vous rajoutez à la liste correspondante selon le même principe que la ligne 112

    Merci !

Discussions similaires

  1. parser un fichier log avec un script php
    Par franco9 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2013, 21h08
  2. Parser un fichier log
    Par darksun971 dans le forum Débuter
    Réponses: 1
    Dernier message: 14/05/2012, 08h53
  3. Réponses: 5
    Dernier message: 18/03/2011, 22h43
  4. Fichier log : observation des évènements
    Par SylVNR dans le forum VBA PowerPoint
    Réponses: 2
    Dernier message: 05/10/2008, 12h13
  5. Parser de fichier textes >> Logs Apache
    Par gregb34 dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2006, 18h34

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