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. #21
    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
    Ok on avance avec ton nouveau code.

    Poursuit la réécriture en factorisant aussi tes regex comme ceci :

    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
     ### On définie toutes les regex
        RegexByAtype = [
    # "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
            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)",
    # "HIT" Event Type (AType:1)
    # T:130277 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430       
            r"^T:(?P<tik>\d+) AType:1 AMMO:(?P<ammo>[-\w]+) AID:(?P<attacker_id>\d+) TID:(?P<target_id>\d+)$",
    # "DAMAGED" Event Type (AType:2)
    # T:194164 AType:2 DMG:0.0040 AID:1202220 TID:1178645 POS(280906.0000,5691.9624,145361.6250)
            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+)\)$",
    # "KILL" Event Type (AType:3)
    # T:203 AType:3 AID:-1 TID:220160 POS(225177.4063,12.3517,239741.1250)
            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+)\)$",
            ## etc
            ]
     
        #### On les compile toutes une bonne fois pour toute en dehors du while
        RegexByAtype = [ re.compile(regex) for regex in RegexByAtype ]

    Pour ta fonction, pour la tester il est plus judicieux de l'appeler ! Et de lui faire retourner qqch, et d'en printer le résultat.
    Donc a la fin de ton code plutot écrire comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            if line == "":
                print ("All events are loaded")
                break
     
        return AllEvents  ### fin de la fonction
     
    ### En dehors (après) la fonction
    AllEvents = extraction('missionreport.txt')
    print(AllEvents)

    Et pour le code de BufferBob, non tu n'as manifestement pas compris grand chose. Je lui laisses le soin de t'expliquer s'il revient par là, mais je trouve de toute manière plus utile de te faire construire un code que tu comprends, surtout si l'objectif après est d'ajouter de nouvelles fonctionalités !

  2. #22
    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
    Citation Envoyé par fabgenius Voir le message
    A la ligne 25 atype_regex = re.compile('AType:(\d+)') => on commence par définir un regex des Atype
    oui, comme on est sûr que chaque ligne contiendra au moins cette information, on l'extrait et ça nous permet de décider quelle regex appliquer sur la ligne, ça vaut mieux que de tester la totalité des regex pour chaque ligne jusqu'à trouver celle qui match

    Citation Envoyé par fabgenius Voir le message
    A la ligne 26 on crée une chaîne de dictionnaire des "Atype" à traiter
    on crée une liste de dictionnaires, et dans chaque dictionnaire on trouve 3 informations, la description, la liste dans laquelle on devra ajouter ce qu'on extrait, et la regex spécifique à ce AType précis

    Citation Envoyé par fabgenius Voir le message
    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
    la regex atype_regex permet de récupérer le AType de la ligne (donc regex.search(ligne) classiquement, sauf que ça nous retourne un objet complet, nous on ne veut que le 1er groupe capturé qui contient l'info qu'on cherche : .group(1) dans le cas présent, à la fin on convertit en entier avec int().

    Citation Envoyé par fabgenius Voir le message
    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) ?
    on connait le AType de la ligne, donc on veut lui appliquer la regex de ce AType précis, si on a une ligne AType:0 on veut lui appliquer la regex INITIAL, ben c'est celle là dwh[0]['regex'], il suffit de tester dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> AType = 2
    >>> dwh[AType]['description']
    'DAMAGED'
    >>> dwh[Atype]['regex']
    re.compile('^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+)\\))
    Citation Envoyé par fabgenius Voir le message
    A la ligne 113 resultat = reg.groupdict() => grâce à l'attribut de la fonction vous nommez vos clefs en fonction des sous-groupes regex
    reg est un objet du module re, la méthode .groupdict() permet de récupérer un dictionnaire avec les groupes nommés capturés (je vois d'ailleurs pas d'autre intérêt aux groupes nommés en fait...)

    si la regex r'(?P<pouet>hello) (?P<coincoin>world)' match, groupdict() renverra donc le dictionnaire { 'pouet':'hello', 'coincoin':'world' }, pratique.

    Citation Envoyé par fabgenius Voir le message
    A la ligne 114 dwh[atype]['liste'].append(resultat) => vous rajoutez à la liste correspondante selon le même principe que la ligne 112
    c'est ça et comme dit c'est en fait superflu, puisqu'avec une seule liste globale de tous les events on peut retrouver rapidement toutes ces sous-listes

  3. #23
    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 encore à vous deux pour votre patience.

    Je me suis inspiré de vos propositions pour faire 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
    # coding: utf-8
     
     
     
     
    ###########################Fonction#############################################
     
     
    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 ")
     
    # Create list
     
        liste_all_events    = []
     
     
    ### Defined regex pattern 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 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>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)")
     
    # "HIT" Event Type (AType:1)
    # T:130277 AType:1 AMMO:BULLET_GER_7-92x57_AP AID:781354 TID:1040430
        atype_1 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>1) AMMO:(?P<ammo>[-\w]+) AID:(?P<attacker_id>\d+) TID:(?P<target_id>\d+)$")
     
    # "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 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>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+)\)$")
     
    # "KILL" Event Type (AType:3)
    # T:203 AType:3 AID:-1 TID:220160 POS(225177.4063,12.3517,239741.1250)
        atype_3 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>3) AID:(?P<attacker_id>[-\d]+) TID:(?P<target_id>[-\d]+) POS\((?P<posx>-?\d+\.\d+)\, ?(?P<posy>-?\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
     
    # "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 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>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+)\)$")
     
    # "TAKE OFF" Event Type (AType:5)
    # T:91410 AType:5 PID:780326 POS(258321.4219, 63.3613, 48782.1484)
        atype_5 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>5) PID:(?P<aircraft_id>\d+) POS\((?P<posx>-?\d+\.\d+)\, ?(?P<posy>-?\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
     
    # "LAND" Event Type (AType:6)
    # T:146520 AType:6 PID:781354 POS(241226.5000, 56.3776, 112472.2734)
        atype_6 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>6) PID:(?P<aircraft_id>\d+) POS\((?P<posx>-?\d+\.\d+)\, ?(?P<posy>-?\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
     
    # "MISSION END" Event Type (AType:7)
    # T:450003 AType:7
        atype_7 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>7).?$")
     
    # "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 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>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]+)$")
     
    # "AIRFIELD" Event Type (AType:9)
    # T:10 AType:9 AID:39936 COUNTRY:101 POS(184785.5938, 2.6443, 240943.4375) IDS()
        atype_9 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>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]*)\)$")
     
    # "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 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>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+)")
     
    # "GROUP INIT" Event Type (AType:11)
    # T:1 AType:11 GID:115711 IDS:17407,26623,35839 LID:17407
        atype_11 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>11) GID:(?P<group_id>\d+) IDS:(?P<members_id>[,\d]*) LID:(?P<leader_id>\d+)$")
     
    # "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 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>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+)\)$")
     
    # "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 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>13) AID:(?P<area_id>\d+) COUNTRY:(?P<country_id>\d{1,3}) ENABLED:(?P<enabled>\d) BC\((?P<in_air>[,\d]+)\)$")
     
    # "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 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>14) AID:(?P<area_id>\d+) BP(?P<boundary>[-,\(\)\.\d]+)$")
     
    # "LOG VERSION" Event Type (AType:15)
    # T:0 AType:15 VER:17
        atype_15 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>15) VER:(?P<version>\d+)$")
     
    # "BOT UNINIT" Event Type (AType:16)
    # T:450029 AType:16 BOTID:2344974 POS(270953.3750,65.3429,149223.5313)
        atype_16 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>16) BOTID:(?P<bot_id>\d+) POS\((?P<posx>-?\d+\.\d+)\, ?(?P<posy>-?\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
     
    # "POSITION CHANGED" Event Type (AType:17)
    # T:58 AType:17 ID:107519 POS(39013.016,45.535,16807.107)
        atype_17 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>17) ID:(?P<object_id>\d+) POS\((?P<posx>-?\d+\.\d+)\, ?(?P<posy>-?\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
     
    # "BOT LEAVE" Event Type (Eject ??) (AType:18)
    # T:168858 AType:18 BOTID:1204267 PARENTID:1203243 POS(277889.3750,6450.9058,129604.6172)
        atype_18 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>18) BOTID:(?P<bot_id>\d+) PARENTID:(?P<parent_id>[-\d]+) POS\((?P<posx>-?\d+\.\d+)\, ?(?P<posy>-?\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
     
    # "END OF THE TOUR" Event Type (AType:19)
    # T:706771 AType:19
        atype_19 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>19)$")
     
    # "JOIN PLAYER" Event Type (AType:20)
    # T:0 AType:20 USERID:52c04d8d-4616-4840-8648-dd9e9da4570a USERNICKID:de8bec6d-a6a0-42dd-945d-3804689a1dd5
        atype_20 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>20) USERID:(?P<account_id>[-\w]{36}) USERNICKID:(?P<profile_id>[-\w]{36})$")
     
    # "EXIT PLAYER" Event Type (AType:21)
    # T:18573 AType:21 USERID:d5bc9e4c-055c-46c2-8ace-8a7daa9eed4a USERNICKID:e608236e-332a-4843-8421-8e013c59685f
        atype_21 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>21) USERID:(?P<account_id>[-\w]{36}) USERNICKID:(?P<profile_id>[-\w]{36})$")
     
    # "TANK EVENT (??)"  Event Type (AType:22)
    # T:36160 AType:22 PID:1684580 POS(223718.406, 10.337, 242309.250)
        atype_22 = re.compile(r"^T:(?P<tik>\d+) AType:(?P<atype_id>22) PID:(?P<parent_id>[-\d]+) POS\((?P<posx>-?\d+\.\d+)\, ?(?P<posy>-?\d+\.\d+)\, ?(?P<posz>\d+\.\d+)\)$")
     
    ### Regex pattern list
     
        RegexByAtype = [atype_0, atype_1, atype_2, atype_3, atype_4, atype_5, atype_6, atype_7,
                        atype_8, atype_9, atype_10, atype_11, atype_12, atype_13, atype_14,
                        atype_15, atype_16, atype_17, atype_18, atype_19, atype_20, atype_21,
                        atype_22]
     
    # Detect Atype format
        atype_regex = re.compile('AType:(\d+)') 
     
    #counter flag error line
        counter_flag = 0
     
    # Read mission report file line after line
        while 1:
            line = missionreport.readline()
            counter_flag = counter_flag+1
     
            if line != "":
                atype_id = int(atype_regex.search(line).group(1))
     
                if atype_id != None:
                    regex_pattern = RegexByAtype[atype_id]  ### use pattern defined on RegexByAtype
                    event = regex_pattern.match(line)       ### match line
                    if event != None :
                        dico_event = event.groupdict()      ### create dico from regex group keys
                        liste_all_events.append(dico_event) ### append dico to the list
                    else :
                        print ("Error in match on line ", counter_flag)
                        print(line)
     
                elif atype_id < 0 or atype_id >22:
                    print ("Some AType are unclassified on this programm on line ", counter_flag)
                    print(line)           
                    continue
     
                elif atype_id == None:
                    print ("atype_id are \"None\" on line ", counter_flag)
                    print(line)           
                    break
     
    # End of collect mission report            
            if line == "":
                print ("End of mission report file. Please check error above")
                break
     
        return liste_all_events
    J'ai pas mal galérer sur des erreurs pour trouver où cela provenait.
    J'ai trouvé la solution après de multiples recherches et ayant appliqué un "drapeau" d'erreur.
    J'avais des coordonnées x ou z négatives ainsi que la lecture de la dernière ligne me générait un erreur de Atype puisqu'elle ne trouvait rien sur celle-ci (c'est surtout cette dernière que j'ai eu du mal à trouver... j'ai ensuite rajouter la condition non null pour la poursuite du fichier).

    Je suis à l'écoute de vos conseils pour la suite.

    Pour créer mes statistiques, vous me conseillez de créer des formules à part ?


  4. #24
    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
    Salut

    Lorsque j'essaie ton nouveua code, sur un fichier qui contient cela
    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)
    (que tu nous avait donné dans tes premiers posts), ton code crache une erreur ...

    et après pour les statistiques, par laquelle voudrais tu commencer ? Sachant qu'une manière de faire, c'est de créer une fonction par statistique voulu, fonction qui prendra en paramètre le fameux list_all_event retourner par la fonction d'extraction.

  5. #25
    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,

    Il y a un code erreur car la ligne 4 était incomplète dans mon exemple, la voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Pour les statistiques, voici les principaux:

    - Liste des avions détruits par camp (par type avion et avec nom du joueur)
    - Liste des avions endommagés par camp et le cumul des dommages (ceux détruits sont à éliminer de cette liste pour ne pas les compter 2 fois)
    - Liste des objets détruits par camp
    - Liste des objets endommagés par camp avec le cumul des dommages (ceux détruits sont à éliminer de cette liste pour ne pas les compter 2 fois)
    - Total des munitions utilisées par camp (les munitions non utilisées d'un avion détruit et/ou capturé devront être comptabilisées)
    - carburants consommés par camp (idem ci-dessus)

    Je vais essayer de soumettre une fonction selon tes dernières propositions et reviendrais vers vous.

    A+

  6. #26
    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
    Tu peux post traiter liste_all_events de sorte à hierarchiser cette liste. Je m'explique : au lieu d'avoir tous les events à la suite pourquoi ne pas les ranger par camp (puisque ca à l'air d'être beaucoup des stats sur les camps qui t'intéresse) ? C'est-à-dire au lieu de la liste des events [ { 'tik': tik_id , 'autre_clés' : ... } ] avoir un dictionnaire d'events { tik_id : liste_all_events_correspondant_a_tik }.

    Une fois tes données rangeées comme cela, tu pourras faire ce que tu veux par camp

  7. #27
    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,

    Malheureusement le "tik" ne correspond qu'au temps écoulé depuis le début de la mission; le country_id n’apparaît quant à lui que sur certains évent et ne sont pas repris ensuite.

    Pour l'instant j'arrive à avoir la liste de toutes les catégories d'objets tués (avions "joueur", bâtiments, avion "IA", etc...) en me servant de l'Atype = 3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def kill (namefile):
        liste_all_events = extraction(namefile)
        kill_list = [(item["tik"], item["attacker_id"], item["target_id"]) for item in liste_all_events if item["atype_id"] == "3"]
        return kill_list
    Il faut que je recherche ensuite dans l'Atype=12 à quel type d'objet et quel pays correspond chaque target_id de la "kill_list (en sachant qu'un avion "joueur", va d'abord apparaître en "IA" sur l'Atype 12 puis en "joueur" sur l'Atype 10; d'autre part la totalité des objets, avions, véhicule, etc.. apparaissent en Atype=10 et que l'on ne peut pas les différencier que par le nom de l'objet) puis le nom du joueur correspondand dans l'Atype=10.

    A+

  8. #28
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def kill (namefile):
        liste_all_events = extraction(namefile)
        kill_list = [(item["tik"], item["attacker_id"], item["target_id"]) for item in liste_all_events if item["atype_id"] == "3"]
        return kill_list
    Non ! Si tu fais plein de fonction de stat, tu ne vas pas recharger à chaque fois tes données !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def kill (liste_all_events):
        kill_list = [(item["tik"], item["attacker_id"], item["target_id"]) for item in liste_all_events if item["atype_id"] == "3"]
        return kill_list
     
    ### A l'exterieur des fonctions, on y fait appel judicieusement
    liste_all_events = extraction(namefile)
    kill_list =  kill(liste_all_events)
    hit_list =  hit(liste_all_events)
    ### etc, sans avoir à recalculer liste_all_events dans chaque fonction
    Pour le tik, je confonds avec le "T" dans le fichier alors surement. Ca correspond à quoi T ?

    Ta liste_all_events peut devenir un dictionnaire également trié par type aussi, ca peut être un choix également.

  9. #29
    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 T:<chiffres> correspond au "tik" c'est à dire au temps écoulé.

    Le souci que je rencontre c'est que je ne peux pas parcourir une liste par item car les éléments recherchés ne sont pas dans les mêmes dictionnaires (les conditions ne font pas partie du même "item"); ce que je recherche à faire c'est quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def kill (liste_all_events):
        kill_list = [(item["tik"], item["attacker_id"], item["target_id"]) for item in liste_all_events if item["atype_id"] == "3"]
        country_id = [y["country_id"] for y in liste_all_events and x in kill_list if y["object_id"]  == x["target_id"]]
        kill_list.append(country_id)
        return kill_list
    ou comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def kill (liste_all_events):
        kill_list = [(item["tik"], item["attacker_id"], item["target_id"]) for item in liste_all_events if item["atype_id"] == "3"]
        n = 0
        while n < len(kill_list):
            element = kill_list[n]
            target_id = element[2]
            country_id = [item["country_id"] for item in liste_all_events if item["object_id"] == target_id and item["atype_id"] == "12"]
            kill_list.append(country_id)
            n=n+1
        return kill_list
    Malheureusement cela ne donne rien...

    A+

  10. #30
    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
    Cela ne veut rien dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    country_id = [y["country_id"] for y in liste_all_events and x in kill_list if y["object_id"]  == x["target_id"]]
    Ca ne te crache pas une erreur ? L'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for y in liste_all_events and x in kill_list
    n'existe pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for y in liste_all_events :
       for x in kill_list :
    existe.

    Donc peut etre est ce cela que tu cherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    country_id = [y["country_id"] for y in liste_all_events for x in kill_list if y["object_id"]  == x["target_id"]]

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