Win3x.Org

Windows & DOS Community

[Résolu] Comment rechercher et remplacer en python 2.7.2

Post Reply   Page 1 of 3  [ 21 posts ]
Jump to page 1 2 3 »
Author Message
MediaVistaIntel
Post subject: [Résolu] Comment rechercher et remplacer en python 2.7.2
Posted: 24 August, 16:04
Membre inscrit
Offline
 
Posts: 19
Joined: 20 May, 17:35
 
Titre original: Comment rechercher et remplacer sous cmd?
Bonjour, je viens demander de l'aide parce que je n'arrive pas à rechercher et remplacer une chaîne de caractère par une autre sous cmd avec switch.exe pour un fichier voici le code que j'ai essayer
:chemin
Set "chemin1=Z:\Source\data\design\buildings\industry\businessservice\b_office30_t2.class"
:commande
Set "chaine1=<ResourceNumber>dec</ResourceNumber>"
Set /a resultat=%dec%*5
Set "chaine2=<ResourceNumber>%resultat%</ResourceNumber>"
"C:\Windows\System32\switch.exe" %chemin1% "%chaine1%" "%chaine2%"

j'ai tester ça ne marche pas ça ne donne pas du tout le resultat que je veut.
Ce que je veut c'est remplacer
<ResourceNumber>dec</ResourceNumber>

par
<ResourceNumber>%resultat%</ResourceNumber>

bien sur dec peut être n'importe quel nombre décimal et %resultat% ce nombre multiplier par 5.

Ensuite quand tout celà sera aux point je voudrais savoir comment faire pour rechercher et remplacer une chaîne de caractère par une autre sous cmd mais là sur plusieurs fichiers d'un seul coup avec condition si pour le de fichier si le fichier à le bon nom il est traiter si non fichier suivant.

Et à oui pour vérifier si le fichier à bien la ligne suivante à traiter
   <Production1> 
    <ResourceName>ROFF_0</ResourceName> 
    <ResourceNumber>dec</ResourceNumber> 
    <ResourceUnitMinPriceBenef>dec</ResourceUnitMinPriceBenef> 
   </Production1>

sinon fichier suivant comment on fait?

Aussi je voudrais remplacer sur plusieurs lignes avec différent variable exemple
  <MaxJobPerCulture> 
   <AllAm>2</AllAm> 
   <Suit>2</Suit> 
  </MaxJobPerCulture>

pour traiter
<AllAm>2</AllAm>

et
<Suit>2</Suit>

séparément mais bien entre les 2 lignes suivante
  <MaxJobPerCulture>

et
  </MaxJobPerCulture>
le nombre de ligne pour entre
  <MaxJobPerCulture>
et
  </MaxJobPerCulture>

est variable il peut y avoir de 1 ligne à 4 lignes donc pour
  <MaxJobPerCulture>

et
  </MaxJobPerCulture>

qui sont des variables de début et de fin il peut y avoir entre 1 ligne et 4 lignes
exemple
  <MaxJobPerCulture> 
   <Low>2</Low> 
   <AllAm>2</AllAm> 
   <Suit>2</Suit> 
   <Elite>2</Elite> 
  </MaxJobPerCulture>

donc pour
   <Low>2</Low>

ou
   <AllAm>2</AllAm>

ou
   <Suit>2</Suit>

ou
   <Elite>2</Elite>

il peut y avoir 0 ligne à 3 lignes qui les sépare de
  <MaxJobPerCulture>

et
  </MaxJobPerCulture>
.


Autre question Pour remplacer n'importe quel chiffre sous cmd c'est quoi le caractère bonus?
Edit: j'ai résolu mon problème mais pas avec le langague bat ni avec le programme cmd de Windows XP, Windows Vista, Windows 7 mais avec python 2.7.2 version Windows 32 bits.


----
Publié : Mercredi 07 Septembre 2011 12:51:46

Rebonjour je n'ai toujours pas résolu le problème bien que j'ai pu faire une partie de code opérationnel le voici
@echo on
:chemin
set "chemin1='dir "Z:\source\*t2.*" /b /s /-c /a:-d-s-h'"
set "chemin2="Z:\source\data\design\buildings\industry\businessservice\b_office30_t2.class""
:fichier
for /f "delims=" %%i in (%chemin1%) do (call :fichierencours %%i)
:fichierencours
set disque=%~d1&
set chemin3=%~p1&
set chemin4=%chemin3:~8%
set chemin5="Z:\destination X2\%chemin4%%nom%%extension%"
set nom=%~n1&
set extension=%~x1
set chemin6=%disque%%chemin3%%nom%%extension%
set Rep1="Z:\destination X2\%chemin4%"
set Rep1md=md %Rep1%
:variable
set "variable1=[0-9]*"
set "chaine1=<ResourceNumber>%variable1%</ResourceNumber>"
for /f "delims=" %%a in ('findstr "%chaine1%" %1') do (%%a
%Rep1md%
echo set "chaine2=%%a">>%chemin5%)
Notez que certaines variable set ne serve pas pour l'instant!
En gros ça dis pour l'étiquette :fichier tout les fichiers qui commence par n'importe quoi en nom et qui se termine par t2 juste avant l'extension et ayant n'importe quel extension ainsi des fichiers des sous dossiers du répertoire source dans le lecteur Z: avec arborescent de dossiers et non.extension des fichiers préserver qui va dans :fichierencours la variable %chemin6% c'est l'adresse complète du fichier en cours, %chemin5% celui du fichier de sortie %Rep1% le répertoire de sortie et %Rep1md% la création du répertoire de sortie si il n'existe pas.

MediaVistaIntel


----
Publié : Dimanche 11 Septembre 2011 10:43:17

Rebonjour, toujours dans mon problème, je voudrais savoir comment appeler une variable set par %nombre1% mais qui ce trouve dans un autre fichier cmd?

Last edited by MediaVistaIntel on 02 March, 15:36, edited 6 times in total.

Top
Quote
le chef suprême
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 11 September, 18:39
Membre inscrit
User avatar
Offline
 
Posts: 326
Joined: 02 June, 18:57
 
Salut !
A condition de respecter la casse et sans utiliser de programme extérieur, sache que l'on peut remplacer n'importe quoi par n'importe quoi, mais dans ce cas il faut malheureusement réécrire tout le fichier. Pour la recherche, assez facile, et en plus on peut avoir le n° de la ligne.

Dommage pour la casse, car il faut dans ce cas activer les extensions de commande de façon obligatoire dans ce cas... :roll: Mais sinon on peut le faire facilement.

Souci gênant cependant : on ne peut pas ignorer comme on veut les itérations d'une même ligne. J'explique. Si tu ignores une première itération de remplacement sur la même ligne, la recherche passe soit directement à la ligne suivante, soit revient au même endroit : on ne peut pas passer à la 2ème itération de la ligne sans avoir remplacé la 1ère. Ou alors il faut ruser sérieusement en remplaçant chaque itération par un code unique spécifique avant de traiter (outch).

T'es prêt à utiliser une boucle FOR avec la fonction TYPE sous CMD (Windows 2000 minimum) ? :lol:
Ou alors je le ferai quand j'aurai le temps.

Prudence : je crois ça ne fonctionne qu'avec des fichiers ANSI avec sauts de ligne CR+LF, et si jamais on trouve quelque chose comme %variable% dans le texte, il faudra échapper tout ça en plus, bla bla bla.

Non mais je t'assure, c'est chaud à faire. Mais j'suis assez chaud pour avoir l'esprit qui tourne bien. Surtout qu'il y a un fichier de sortie séparé (qui sera replacé à la place de l'original si nécessaire) et un batch temporaire, car on ne peut pas imbriquer les variables (remplacer les itérations de la variable de recherche par la variable de remplacement, dans la variable de contenu d'une ligne n'est pas possible directement).

Par contre, je ne connais pas l'utilitaire SWITCH.EXE ! :oops:


EDIT : Si tu peux fabriquer le BATCH2.BAT en conséquence, c'est cool. Pour ton problème de variable à repêcher de ton autre batch, tu fais un
CALL BATCH2.BAT VARIABLE1
à l'endroit voulu.
Tu mets une étiquette
:VARIABLE1
dans le BATCH2.BAT juste avant le
SET VARIABLE1=valeur
et juste après cette définition de la variable tu ajoutes
if "%1"=="VARIABLE1" goto FIN
Au début de BATCH2.BAT tu ajoutes
if "%1"=="VARIABLE1" goto VARIABLE1
Et enfin à la fin de BATCH2.BAT n'oublie pas d'ajouter l'étiquette
:FIN
J'espère que ceci répondra à ton problème, dont j'ai bâclé la lecture.

_________________

Expert en MS-DOS, Windows 3.x, Windows 4.x (95/98/ME).
Live-CD Windows 95 !


Top
Quote
MediaVistaIntel
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 12 September, 11:26
Membre inscrit
Offline
 
Posts: 19
Joined: 20 May, 17:35
 
Merci pour ton aide et ta réponse je vais étudier ça, j'ai aussi posser la même question sur d'autre forum comme clubic par exemple Comment rechercher et remplacer sous cmd? et maintenant je n'attaque à plusieurs lignes qui se suive.


----
Publié : Mercredi 14 Septembre 2011 16:37:51

Rebonjour, comment extrait une seul ligne d'un fichier d'après son N° de ligne par exemple si je veut extraire la ligne N° "70" comment faire pour extraire la ligne N° "70"? La 1er ligne du fichier étant bien la N°1.


Top
Quote
le chef suprême
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 15 September, 00:17
Membre inscrit
User avatar
Offline
 
Posts: 326
Joined: 02 June, 18:57
 
Dans une boucle FOR qui va traiter chaque ligne de la commande TYPE fichier.txt, tu utilises une variable comme i que tu incrémentes à chaque itération. Pour que l'incrémentation fonctionne, il faut initialiser avant de commencer :
SET /A i=0
Ensuite au début de chaque itération dans la boucle FOR, tu mettras une incrémentation :
SET /A i=%i%+1
En guise de bonus je vais te donner l'exemple tout fait :
SET /A i=0
FOR /F "tokens=*" %%G IN ('TYPE fichier.txt') DO (
	SET /A i=%i%+1
	if %i%==70 set extrait=%%G
)
Dans l'exemple :
- %%G contient la ligne correspondant au n° d'itération i.
- Quand i atteint 70, je mets le contenu de la ligne 70 dans la variable extrait.
- Le fichier est parcouru complètement de façon systématique.

Tu peux également utiliser la même méthode avec la commande MORE avec le commutateur +n (commencer à la ligne n). Pour que ça fonctionne tout seul il faut le sortir sur NULL sinon il va demander les appuis au clavier. Cependant, lorsqu'il est traité par une boucle FOR, j'imagine que la sortie est implicitement NULL et que ça fonctionnera très bien. Ceci permet d'éviter d'avoir à traiter les premières lignes avant la ligne souhaitée, de sorte que si la ligne cherchée est plutôt à la fin du fichier, il ira beaucoup plus vite pour la trouver. C'est impossible d'arrêter le parcours d'un fichier jusqu'à sa fin, aussi bien pour TYPE que pour MORE.

Et encore une fois : Windows 2000 minimum pour ces syntaxes évoluées.

_________________

Expert en MS-DOS, Windows 3.x, Windows 4.x (95/98/ME).
Live-CD Windows 95 !


Top
Quote
MediaVistaIntel
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 15 September, 17:15
Membre inscrit
Offline
 
Posts: 19
Joined: 20 May, 17:35
 
Rebonjour pour mon système d'exploitation pas de problème je suis sous Windows 7, mais pour la syntaxe que tu n'a donner j'ai bien peur qu'elle est une ou des erreur quel pare ça ne mais toujours 0 comme N° de ligne avec ton code

si tu a une idée de où ça viens?
le code en entier pour moi
@echo on
set "chemin2="Z:\source\data\design\buildings\industry\businessservice\b_office30_t2.class""
SET /A i=0
FOR /F "tokens=*" %%G IN ('TYPE %chemin2%') DO (
   SET /A i=%i%+1
   if %i%==70 set extrait=%%G
)
Edit: bien sur je veut extrait la ligne telle N° pour ne modifé que elle, par exemple si plusieurs lignes on les même chaines caractères de à l'indentique de ne pas répéter l'opérartion et faire un fichier de sortie avec seulement les lignes modifié voulu et pas toutes celle qui resemble mais qui n'on pas le même N°, fichier de sortie en entier et ligne modifié seulement d'après leurs N°.


Top
Quote
le chef suprême
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 17 September, 16:12
Membre inscrit
User avatar
Offline
 
Posts: 326
Joined: 02 June, 18:57
 
Aide wrote:
L'expansion retardée de variables d'environnement vous permet d'utiliser un autre caractère (le point d'exclamation) afin d'étendre les variables d'environnement durant l'exécution. Si l'expansion retardée de variables est activée, les exemples ci-dessus peuvent être écrits comme suit afin de fonctionner comme vous le souhaitez :

set VAR=avant
if "%VAR%" == "avant" (
set VAR=après
if "!VAR!" == "après" @echo Cela marche si vous lisez ce message
)
J'ai par erreur pensé que cela ne nous concernait pas, mais c'est aussi bien valable dans une structure IF qu'une boucle FOR, quelle que soit la variable. En fait, la variable ne prendra sa valeur qu'à la sortie de la boucle, ce qui est ennuyeux.
La solution est la suivante :
Il faut lancer CMD.EXE avec le commutateur /V:ON
Il faut remplacer %i% par !i! dans la boucle FOR.

Ou alors peut-être qu'il existe un autre paramétrage de la boucle FOR pour inclure une variable de n° d'itération, mais dans ce cas-là bye bye aux paramètres d'offset de la fonction MORE, sauf si on peut définir la valeur de départ. Je n'ai pas trouvé une telle possibilité.

Au fait, il n'y a pas besoin de la fonction TYPE ou MORE avec FOR, car FOR peut parcourir le fichier tout seul.
Aide wrote:
FOR /F ["options"] %variable IN (ensemble-fichiers) DO commande [paramètres]
FOR /F ["options"] %variable IN ("chaîne") DO commande [paramètres]
FOR /F ["options"] %variable IN ('commande') DO commande [paramètres]
Par contre je ne vois pas comment entrer un nom de fichier long, car si tu mets des guillemets il va croire que c'est une chaîne, malheureusement... Peut-être qu'il suffit d'entrer un nom de fichier sans guillemets. :roll:

Désolé pour la perte de temps encourue par ma négligence. :oops:

_________________

Expert en MS-DOS, Windows 3.x, Windows 4.x (95/98/ME).
Live-CD Windows 95 !


Top
Quote
MediaVistaIntel
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 24 September, 16:16
Membre inscrit
Offline
 
Posts: 19
Joined: 20 May, 17:35
 
Rebonjour après plusieurs jours ne revoilà et avec encore quelques questions comment mettre le commutateur /A pour faire un fichier Ainsi, dans le cmd je veut dire un exemple complet par exemple echo îôöïéàèê>>sortie.txt, je sais pas ou le mettre le commutateur /A?
Et à oui si j'ai un fichier d'entrée de 166 lignes le fichier de sortie fait 167 lignes c'est à dire les 166 lignes + 1 ligne vierge un idée de pourquoi ça et comment avoir 166 lignes et pas 167?


Top
Quote
le chef suprême
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 25 September, 23:52
Membre inscrit
User avatar
Offline
 
Posts: 326
Joined: 02 June, 18:57
 
Le commutateur /A doit être utilisé lorsque tu lances CMD.EXE, qui va à son tour lancer ton batch.
Exemple :
CMD.EXE /A /C "c:\...\batch1.bat"
Pour la ligne vierge en plus, je ne sais pas vraiment. Avec la fonction TYPE je ne vois pas d'où peut venir le problème. Tu utilises quoi pour traiter ton fichier ?

_________________

Expert en MS-DOS, Windows 3.x, Windows 4.x (95/98/ME).
Live-CD Windows 95 !


Top
Quote
MediaVistaIntel
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 26 September, 11:54
Membre inscrit
Offline
 
Posts: 19
Joined: 20 May, 17:35
 
Pour le commutateur /A je pense que c'est juste les fichiers sorties qu'il va mettre en Ansi c'est ça? je veut dire il faut toujours encoder le texte de commande en OEM 850?

Sinon comment on fait pour voir si dans un fichier si 2 lignes ce suivent et sont présente comme par exemple
%tabulation%<Production1>
%tabulation%<ResourceName>ROFF_0</ResourceName>
si elle existe exécuter une commande avec call :étiquette et/ou traiter le fichier, si non fichier suivant et aussi voir si il y a un N° de ligne avec cette chaîne de caractères
%tabulation%<Production1>
et un autre N° de ligne avec cette chaîne de caractère
%tabulation%<ResourceName>ROFF_0</ResourceName>
toujours dans le même esprit de traiter si existe traiter le fichier et si non fichier suivant et si plus de fichier à traiter parce que tout les fichiers on était passer en revu commande exit pour quitter le batch?

À est oui pour les N° de lignes mis dans des variable si est ce que si les lignes n'existe pas ça va mettre remettre à zéro les variable (les vidée) ou pas, je veut dire si il y avait avant un N° de ligne dans une variable mis par le fichier précédent mais que le fichier en cours n'a pas la ligne en question pas celle voulu ça va vider la variable ou pas?
Ce que je veut dire par ligne voulu, c'est que si la variable de la ligne est vide fichier suivant.

Last edited by MediaVistaIntel on 30 September, 10:17, edited 1 time in total.

Top
Quote
le chef suprême
Post subject: Re: Comment rechercher et remplacer sous cmd? Non Résolu
Posted: 27 September, 20:04
Membre inscrit
User avatar
Offline
 
Posts: 326
Joined: 02 June, 18:57
 
MediaVistaIntel wrote:
Pour le commutateur /A je pense que c'est juste les fichiers sorties qu'il va mettre en Ansi c'est ça? je veut dire il faut toujours encoder le texte de commande en OEM 850?
Oui c'est bien ça, ça n'affecte que la sortie explicite (pas l'écran si la sortie par défaut est l'écran donc). En revanche pour les autres périphériques de sortie par défaut (ports COM & LPT, ou fichier), aucune idée.
MediaVistaIntel wrote:
Sinon comment on fait pour voir si dans un fichier si 2 lignes ce suivent et sont présente comme par exemple
%tabulation%<Production1>
%tabulation%<ResourceName>ROFF_0</ResourceName>
Utilise un registre à décalage. Si tu as activé l'expansion retardée des variables d'environnement, comme je t'ai montré avec les variables sous la forme !var1!, tu devrais pouvoir faire ceci :
for (...) {
set ligneprec=!ligne!
set ligne=%%G

set /A egales=1
if not "!ligne!" == "Ma 2ème ligne voulue est ici" set /A egales=0
if not "!ligneprec!" == "Ma 1ère ligne voulue est ici" set /A egales=0

if egales==1 echo On y est !
}
MediaVistaIntel wrote:
si elle existe exécuter une commande avec call :étiquette et/ou traiter le fichier, si non fichier suivant et aussi voir si il y a un N° de ligne avec cette chaîne de caractères
%tabulation%<Production1>
et un autre N° de ligne avec cette chaîne de caractère
%tabulation%<ResourceName>ROFF_0</ResourceName>
toujours dans le même esprit de traiter si existe traiter le fichier et si non fichier suivant
Malgré tous mes efforts de compréhension, je n'ai pas réussi à savoir de quoi il est question. :oops:
MediaVistaIntel wrote:
et si plus de fichier à traiter parce que tout les fichiers on était passer en revu commande exit pour quitter le batch?
Si tu as mis l'option /C pour CMD.EXE (par défaut) la fenêtre se quitte d'elle-même une fois le batch terminé. Si tu as mis l'option /K à la place, je crois que tu reviens à l'invite après et que tu peux taper les commandes de ton choix. En revanche si tu souhaites interrompre le batch avant son terme, peut-être qu'effectivement tu peux utiliser exit, mais normalement on fait plutôt un goto vers une étiquette de fin.
MediaVistaIntel wrote:
À est oui pour les N° de lignes mis dans des variable si est ce que si les lignes n'existe pas ça va mettre remettre à zéro les variable (les vidée) ou pas, je veut dire si il y avait avant un N° de ligne dans une variable mis par le fichier précédent mais que le fichier en cours n'a pas la ligne en question pas celle voulu ça va vider la variable ou pas?
Les variables sont globales en batch. Si tu ne changes pas leur valeur avec la fonction SET, la valeur est conservée. Je ne sais pas si dans l'exemple que je t'ai donné précédemment le n° de ligne était remis à 0. Mais si elle n'est pas remise à 0, il faut, car lors du passage au fichier suivant, tu auras un n° de ligne trouvé qui sera [nombre_de_ligne_total_des_fichiers_déjà_lus] + [n°_de_ligne_trouvée_du_fichier_actuel].
MediaVistaIntel wrote:
Ce que je veut dire par ligne voulu, c'est que si la variable de la ligne est vide fichier suivant.
Effectivement si la variable de la ligne n'est pas vidée, il y aura un souci si tu veux la traiter en considérant un autre fichier, car elle n'appartiendra pas au fichier actuel. Mais je ne vois pas dans quel cas cela pourrait arriver, puisque chaque ligne des fichiers lus est passée une à une, non ? :roll:

_________________

Expert en MS-DOS, Windows 3.x, Windows 4.x (95/98/ME).
Live-CD Windows 95 !


Top
Quote
Display: Sort by: Direction:
Post Reply   Page 1 of 3  [ 21 posts ]
Return to “Questions et problèmes résolus” | Jump to page 1 2 3 »
Jump to: