Tous programmer en un fichier

Résolu
nuclecanon Messages postés 267 Statut Membre -  
heyquem Messages postés 808 Statut Membre -
Bonjour à tous,

J'ai lu l'aide sur le langage c++.
Mais je n'ai pas réussi à faire ce que je voulais, je m'explique.

J'aimerai créer un fichier qui permet de modifier la ligne driver dans plusieurs fichier en même temps: (le fichier présent dans l'exemple est un .veh)

exemple:

Code : Autre - Sélectionner

DefaultLivery="Simu_84.DDS"

HDVehicle=DC.hdv
Graphics=DC_Upgrades.gen
Spinner=DC_Spinner.gen
Upgrades=DC_Gold_Upgrades.ini
GenString=
Cameras=DC_cams.cam
Sounds=DC.sfx
HeadPhysics=DC_headphysics.ini
Cockpit=DC_cockpitinfo.ini
AIUpgradeClass=RC1

//////////////////////////HISTOIRE DE L'EQUIPE ET INFORMATIONS///////////////////////////////////////////

Number=84
Team="Simu-Drive"
PitGroup="Group4"
Driver=""
Description="Simu-Drive #84"
Engine="ISM"
Manufacturer="Vayline"
Classes="RC1 Venom CompactSport RallyCross Lienz 2006"

FullTeamName="Simu-Drive"
TeamFounded=2012
TeamHeadquarters="Avignon, France"
TeamStarts=0
TeamPoles=0
TeamWins=0
TeamWorldChampionships=0

Category="Vayline,2006 Venom"

Dans le ligne Driver, je voudrai mettre n'importe quelle nom de pilote à partir d'un fichier à part comme ça j'ai pas besoin de rentrer dans le fichier correspondant de chaque voitures pour changer le nom du pilote.

Une image pour essayer de comprendre mon problème:

http://hpics.li/1c0219d

Voila j'espère que je me suis fait comprendre.

Saluut :)

5 réponses

Résumé de la discussion

Le problème consiste à modifier la ligne Driver dans plusieurs fichiers .veh en utilisant des noms de pilote issus d'un fichier externe, afin d'éviter de modifier chaque fichier manuellement.
Plusieurs réponses proposent un script Python qui lit un fichier de pilotes et remplace les valeurs Driver correspondantes dans chaque fichier .veh à partir d'un nom de pilote associé à l'équipe RC1.
Des éléments détaillent l'utilisation d'expressions régulières pour extraire le nom d'équipe et le pilote, puis remplacer les valeurs correspondantes, avec des considérations de performance et portabilité entre Python, C++ et batch.
En complément, plusieurs auteurs suggèrent d'organiser un fichier pilotes.txt par catégorie RC1 et d'exécuter le script dans le même répertoire pour générer ou modifier les fichiers .veh automatiquement.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. heyquem Messages postés 808 Statut Membre 131
     
    A partir des indications que tu as données, je t'ai fait un code en Python.
    J'espère qu'il y a d'autres langages qui permettent de faire un code semblable de façon rapide, mais moi je ne connais bien que le Python.
    Tu diras si le code correspond à ce que tu veux.
    Si ce n'est pas tout à fait ce que tu veux, ce sera facile de modifier, c'est l'avantage avec Python, c'est productif.

    J'ai créé trois fichiers d'extension .veh dans mon dossier Mes Documents.
    Les deux premiers à partir des fichiers que tu as donnés, le troisième à partir de cette page:
    http://www.old-drivers-spirit.info/wiki/index.php?title=Le_GenString_dans_le_fichier_.veh

    fichier auto1.veh

    DefaultLivery="Simu_84.DDS"
    HDVehicle=DC.hdv
    Graphics=DC_Upgrades.gen
    Spinner=DC_Spinner.gen
    Upgrades=DC_Gold_Upgrades.ini
    GenString=
    Cameras=DC_cams.cam
    Sounds=DC.sfx
    HeadPhysics=DC_headphysics.ini
    Cockpit=DC_cockpitinfo.ini
    AIUpgradeClass=RC1
    //////////////////////////HISTOIRE DE L'EQUIPE ET INFORMATIONS///////////////////////////////////////////
    Number=84
    Team="Simu-Drive"
    PitGroup="Group4"
    Driver="Juju Martin"
    Description="Simu-Drive #84"
    Engine="ISM"
    Manufacturer="Vayline"
    Classes="RC1 Venom CompactSport RallyCross Lienz 2006"
    FullTeamName="Simu-Drive"
    TeamFounded=2012
    TeamHeadquarters="Avignon, France"
    TeamStarts=0
    TeamPoles=0
    TeamWins=0
    TeamWorldChampionships=0
    Category="Vayline,2006 Venom"

    fichier auto2.veh

    DefaultLivery="JMX_28.DDS"
    HDVehicle=DC.hdv
    Graphics=DC_Upgrades.gen
    Spinner=DC_Spinner.gen
    Upgrades=DC_Gold_Upgrades.ini
    GenString=45789954
    Cameras=DC_cams.cam
    Sounds=DC.sfx
    HeadPhysics=DC_headphysics.ini
    Cockpit=DC_cockpitinfo.ini
    AIUpgradeClass=RC1
    //////////////////////////HISTOIRE DE L'EQUIPE ET INFORMATIONS///////////////////////////////////////////
    Number=28
    Team="JMX Motorsport"
    PitGroup="Group4"
    Driver="M.Schumacher"
    Description="JMX Motorsport #28"
    Engine="ISM"
    Manufacturer="Vayline"
    Classes="RC1 Venom CompactSport RallyCross Lienz 2006"
    FullTeamName="JMX Motorsport"
    TeamFounded=2005
    TeamHeadquarters="Sheffield, England"
    TeamStarts=0
    TeamPoles=0
    TeamWins=0
    TeamWorldChampionships=0
    Category="Vayline,2006 Venom"

    fichier auto3.veh

    DefaultLivery="911.dds"
    HDVehicle=cortina_lhd.hdv
    Graphics=CORTINA.gen
    Spinner=CORTINA_Spinner.gen
    Upgrades=cortina_Upgrades.ini
    GenString=53222211
    Cameras=HISTORICFIAGT.cam
    Sounds=cortina.sfx
    HeadPhysics=HISTORICFIAGT_headphysics.ini
    Cockpit=CORTINA_cockpitinfo.ini
    AIUpgradeClass=HP4
    //////////////////////////HISTOIRE DE L'EQUIPE ET INFORMATIONS///////////////////////////////////////////
    Number=92
    Team="Forza Synergy"
    PitGroup="Group4"
    Driver="A.Prost"
    Description="Forza Synergy #92"
    Engine="ISM"
    Manufacturer="Ford and Lotus"
    Classes="Mk"
    FullTeamName="Jujuju"
    TeamFounded=2008
    TeamHeadquarters="Marseille, France"
    TeamStarts=0
    TeamPoles=0
    TeamWins=0
    TeamWorldChampionships=0
    Category="Lotus Cortina"

    J'ai aussi créé le fichier pilotes.txt

    //--------------RC1--------------//  
    
    ----JMX  
    --------Driver="H.R. Redfield"  
    
    ----RisingSun  
    --------Driver="Jos Forseberg"  
    
    ----Simu-Drive  
    --------Driver="A.Matthieu"  
    
    ----Synergy  
    --------Driver="Buno Tagliano"


    En faisant tourner le code suivant, on remplace les pilotes dans les fichiers autox.veh par les pilotes remplaçants indiqués dans pilotes.txt

    import re  
    regx_remplacants = re.compile('^----[ \t]*(.+)[ \t]*\r?\n'  
                                  '--------Driver="[ \t]*(.+?)[ \t]*"',  
                                  re.MULTILINE)  
    
    with open('C:\\Documents and Settings\\Admin\\Mes documents\\pilotes.txt','r') as plt:  
        chplt = plt.read()  
        dico = dict(mat.groups() for mat in regx_remplacants.finditer(chplt))  
    
    print dico  
    
    
    
    
    from os import listdir  
    
    regx_fichier = re.compile('^Team="[ \t]*(.+?)"[ \t]*(\r?\n'  
                       'PitGroup=".+\r?\n'  
                       'Driver=")[ \t]*(.+?)[ \t]*(?=")',re.MULTILINE)  
    
    dir_path = 'C:\\Documents and Settings\\Admin\\Mes documents\\'  
    for filename in listdir(dir_path):  
        if filename[-4:]=='.veh':  
            with open(dir_path+filename,'rb+') as f:  
                ch = f.read()  
                team,_,driver = regx_fichier.search(ch).groups()  
                for code_equipe in dico:  
                    if code_equipe in team:  
                        f.seek(0,0)  
                        f.write(regx_fichier.sub('Team="\\1"\\2' + dico[code_equipe],ch))  
                        print 'team %-18s\tdriver %-18s\tremplacé par %s' % (team,driver,dico[code_equipe])


    Résultat:

    Number=84
    Team="Simu-Drive"
    PitGroup="Group4"
    Driver="A.Matthieu"
    Description="Simu-Drive #84"

    Number=28
    Team="JMX Motorsport"
    PitGroup="Group4"
    Driver="H.R. Redfield"
    Description="JMX Motorsport #28"

    Number=92
    Team="Forza Synergy"
    PitGroup="Group4"
    Driver="Buno Tagliano"
    Description="Forza Synergy #92"

    Bien sûr, tu ne dois pas tout comprendre en détail, mais je pense que le processus général est compréhensible.
    C'est pour te permettre de voir ce qu'on peut faire avec Python et pour que "un programme écrit en 5 minutes qui va tourner en 1/1000 de seconde " ne reste pas des paroles en l'air. J'ai d'ailleurs mesuré le temps d'exécution de ce code avec ces trois fichiers: environ 0.01 seconde (sans les print, parce que chaque print prend beaucoup de temps, ça monte à 0.1 seconde). J'avais dit 1/1000 au pifomètre

    J'ai passé plus de temps à créer les fichiers qu' à coder, parce qu'à part le fichier dans ton premier message, il a fallu que je copie-colle la structure des fichiers et tape à la main les données des trois autres.

    Je suis intéressé de voir si quelqu'un d'autre a quelque chose à proposer, que ce soit en C++, en batch ou en n'importe quoi d'autre.
    En tout cas, avec Python: simplicité, rapidité, efficacité

    PS: le module re fournit l'accès aux expressions régulières. C'est un domaine qui effraie un peu tout le monde, mais c'est un moyen extrèmement puissant de traiter des chaînes de caractères. Il est quasiment impossible de vouloir traiter des fichiers sans cet outil
    1
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      en bash, en modifiant le fichier pilots.txt de manière à avoir un format du genre :
      nom equipe 1 ; pilote de nom
      nom equipe 2 ; ddfjl
      
      on pourrait écrire :
      while read ligne
          do :
             equipe=$(echo ligne|cut -d ';' -f 1)
             pilote = $(echo ligne|cut -d ';' -f 2)
             sed -i 's/Driver=\".*\"/Driver=\"$pilote\"/g' $(grep -l "Team=.*$equipe.*" *.veh)
      done < pilotes.txt
      0
    2. heyquem Messages postés 808 Statut Membre 131
       
      A quoi sert la portion
      $(grep -l "Team=.*$equipe.*" *.veh)
      stp ?

      Et comment le programme sait-il que ligne doit être lue dans le fichier pilotes.txt ?
      0
    3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      $(grep -l "Team=.*$equipe.*" *.veh)
      cherche le fichier contenant le nom de l'équipe.
      le fichier est donné tout à la fin :
      <pilotes.txt
      0
    4. heyquem Messages postés 808 Statut Membre 131
       
      $(grep -l "Team=.*$equipe.*" *.veh) 
      Puissant comme instruction !

      Mais le nom d'une équipe pourrait se trouver dans un fichier qui ne serait pas à modifier: par exemple plusieurs fichiers correspondant à des jours différents, on devrait changer les fichiers d'un jour mais pas les autres;

      oui alors il faudrait ne changer que les fichiers dans laquelle la catégorie serait RC1: dans ce cas comment s'écrirait cette instruction ? bash peut le faire ?
      0
    5. nuclecanon Messages postés 267 Statut Membre 8
       
      Wouahh

      Et bien un grand merci à vous deux en tout cas d'avoir pris le temps de chercher.
      J'ai pris la solution de heyquem en langage python, mais je ne sais pas quelle ligne modifié lol, se serai bien que tu mette des commentaires sur chaque lignes s'il te plait :) si se n'est pas trop demander.
      0
  2. heyquem Messages postés 808 Statut Membre 131
     
    Un langage hyper compliqué pour un objectif hyper simple
    Mais bon, c'est pas la peine que je me fatigue
    0
  3. nuclecanon Messages postés 267 Statut Membre 8
     
    Je ne sais pas faire, ce n'est pas moi qui a écrit le C++.
    0
    1. heyquem Messages postés 808 Statut Membre 131
       
      On s'en doute.

      Mais es tu obligé de choisir C++ ?
      0
    2. nuclecanon Messages postés 267 Statut Membre 8
       
      On me la conseillé.
      0
    3. heyquem Messages postés 808 Statut Membre 131
       
      Et as tu été convaincu par des arguments ou bien as tu obéis à un conseil sans chercher à comprendre ?
      En quoi le C++ est-il adapté à tes problèmes ?
      C'est un langage puissant (paraît il) mais complexe et qui comporte beaucoup de défauts aussi.
      Son principal avantage est qu'il permet de faire des programmes qui tournent très vite. As-tu vraiment besoin d'un programme que tu vas mettre une semaine à écrire pour complèter une ligne dans plusieurs fichiers en 1/10000 de seconde ? Au lieu d'un programme écrit en 5 minutes qui va tourner en 1/1000 de seconde ?
      On t'a expliqué ce genre de chose avec le conseil ?
      0
    4. nuclecanon Messages postés 267 Statut Membre 8
       
      C'est un vendeur de Boulanger qui me la conseillé, il a vu le type qui ne connaissait rien et n'as pas voulu se faire ch**r à m'expliquer.
      Mais heureusement que des personnes comme toi sont là pour éviter toute programmation inutile.
      Pour répondre à ta première question, j'ai obéi à un conseil MAIS en cherchant sur le net pour comprendre le C++.
      Donc j'opterai pour ta proposition qui est:
      "un programme écrit en 5 minutes qui va tourner en 1/1000 de seconde . "

      Merci de m'aider en tout cas.
      0
  4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Salut.
    je n'ai pas tout compris à ton problème, et l'image n'est pas très explicite.
    Tu as d'un coté un fichier avec des noms de pilotes (quel format de stockage ?) et de l'autre, 1 ou plusieurs fichier voiture ? Tu veux affecté un pilote aux voiture.
    Il est clair qu'un simple script bash ferai l'affaire. C'est faisable assez facilement en C++, mais c'est plus compliqué, il y a des logiciels plus simple pour traiter les fichier. C'est plus ou moins la spécialité de bash et de quelques outils associé. Seulement, sous windows il faut téléchargé msys ou cygwin.
    0
    1. nuclecanon Messages postés 267 Statut Membre 8
       
      Le format de stockage des nom de pilotes et du .txt
      Et je voudrai modifier les nom des pilotes à partir de ce texte qui modifiera les fichiers originaux des voitures.

      Exemple:
      Fichier originaux pour nom de pilote A.Prost
      Fichier .txt pour nom de pilote A.Prost que je change en M.Schumacher

      Résultat:
      Fichier originaux pour nom de pilote M.Schumacher

      Mais sa ne change pas la voiture.
      C'est dur à expliquer comme ça lol.
      0
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      en effet ce n'est pas plus clair. Le format de stokage : un pilote par ligne, pilote séparer par des ";" ??
      essai d'être plus concret.
      Tu as un fichier "pilote.txt" ensuite, tu as combien de fichiers à modifier et quels sont leur noms ? (pas la peine de les donner tous, juste 3 ou 4)
      0
    3. nuclecanon Messages postés 267 Statut Membre 8
       
      Voici ce que j'ai:

      RC1 est la catégorie du véhicule
      JMX, RisingSun, Simu-Drive et Synergy sont des équipes.
      http://www.hostingpics.net/viewer.php?id=189062NomDePilotes.jpg

      Ça ce sont les fichiers originaux de chaque équipes:
      http://www.hostingpics.net/viewer.php?id=845265JMXpilote.jpg

      Et je voudrai modifier les nom des pilotes via le fichier .txt (1er lien), et que ça se modifie dans les fichiers originaux.

      Ah oui, le fichier .txt, donc qui rassemble le nom des pilotes dans la catégories RC1, c'est moi qui l'ai créé.
      0
    4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      en fait, c'est beaucoup plus compliqué que je ne pensais. Tu as un fichier avec le nom d'une équipe (équipe d'une seule personne d'ailleurs !?) et un nom de pilote et tu voudrais mettre à jour le nom des pilotes vis à vis de l'équipe dans certains fichiers. En bash, vu le formatage de ton fichier pilote.txt ça risque d'être un peu chiant à faire.
      0
    5. heyquem Messages postés 808 Statut Membre 131
       
      Ce serait intéressant de voir ce que ça donnerait en bash, je veux dire un programme qui prenne vraiment tout en charge de façon complète de A à Z
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. nuclecanon Messages postés 267 Statut Membre 8
     
    C'est bon merci ça fonctionne :)
    0
    1. heyquem Messages postés 808 Statut Membre 131
       
      OK, merci du retour

      Je pense inutile que je précise qu'une fois l'observation du code terminée, les lignes entre
      for z in ('auto1','auto2','auto3'):
      et
      input('pause')
      ne sont plus nécessaires pour l'utilisation réelle, tu as bien dû comprendre .....

      Il te faudra apprendre les expressions régulières. Ce n'est pas un sujet attaché à Python, les regexes servent dans tous les langages. Car il peut y avoir des modifications, mêmes minimes, dans la structure d'un fichier analysé par regex, qui rendent inopérant un code. Pour corriger, il faut alors connaître le fonctionnement des expressions régulières.

      Salut
      0