Tous programmer en un fichier

Résolu/Fermé
nuclecanon Messages postés 234 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 15 janvier 2023 - 2 mai 2012 à 00:02
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 3 mai 2012 à 14:20
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 :)

A voir également:

5 réponses

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 2/05/2012 à 15:31
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
2 mai 2012 à 15:59
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 2/05/2012 à 16:14
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
2 mai 2012 à 16:41
$(grep -l "Team=.*$equipe.*" *.veh)
cherche le fichier contenant le nom de l'équipe.
le fichier est donné tout à la fin :
<pilotes.txt
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 2/05/2012 à 16:52
$(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
nuclecanon Messages postés 234 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 15 janvier 2023 8
Modifié par nuclecanon le 2/05/2012 à 20:54
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
2 mai 2012 à 00:12
Un langage hyper compliqué pour un objectif hyper simple
Mais bon, c'est pas la peine que je me fatigue
0
nuclecanon Messages postés 234 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 15 janvier 2023 8
2 mai 2012 à 00:27
Je ne sais pas faire, ce n'est pas moi qui a écrit le C++.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
2 mai 2012 à 01:03
On s'en doute.

Mais es tu obligé de choisir C++ ?
0
nuclecanon Messages postés 234 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 15 janvier 2023 8
2 mai 2012 à 01:09
On me la conseillé.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
2 mai 2012 à 08:34
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
nuclecanon Messages postés 234 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 15 janvier 2023 8
Modifié par nuclecanon le 2/05/2012 à 11:42
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
2 mai 2012 à 11:50
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
nuclecanon Messages postés 234 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 15 janvier 2023 8
2 mai 2012 à 12:03
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
Modifié par Char Snipeur le 2/05/2012 à 12:44
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
nuclecanon Messages postés 234 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 15 janvier 2023 8
Modifié par nuclecanon le 2/05/2012 à 12:55
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
2 mai 2012 à 15:51
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
2 mai 2012 à 16:17
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nuclecanon Messages postés 234 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 15 janvier 2023 8
3 mai 2012 à 13:57
C'est bon merci ça fonctionne :)
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
3 mai 2012 à 14:20
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