Page 1 sur 2

Remplacer une chaine de caractères dans un fichier texte

Posté : 08 août 2008 23:05
par Bigfish
Bonjour,

Voici une methode qui permet de remplacer une chaine de caractères dans un fichier texte

Ce qui suit est globalement une copie d'une reponse que j'ai faite ici : http://www.codes-sources.com/infomsg_RE ... 2.aspx?p=3

pour commencer je cree un fichier texte appelé LeVillageGaulois.txt et qui ce trouve dans c:\temp.

Voici sa structure :

Asterix
Obelix
Milou
Abraracourcix
Panoramix
Agecanonix

ceux qui connaissent la fameuse BD auront rapidement compris que ce fichier contient une erreur que l'on vas corriger

maintenant le batch puis quelques explications :

Code : Tout sélectionner

----------------------------------------------------------------------------

@ echo off
rem -----------------------------------------------
rem remplacer une chaine de caractères dans un fichier texte
rem cree par Bigfish alias Philippe E
rem le 08-08-08
rem -----------------------------------------------

set chemin=c:\temp\

rem si le fichier n'existe pas ou n'a pu etre trouve, on arrete tout
if not exist %chemin%LeVillageGaulois.txt goto fin

rem on cherche le numero de ligne et on l'ecrit dans un fichier tmp.txt
rem cette valeur est sous la forme d'une chaine: [numeros de ligne]valeur recherchee
type %chemin%LeVillageGaulois.txt | find /n /i "milou" > %chemin%tmp.txt

rem on recupere cette valeur pour la mettre dans une variable
for /f %%i in (%chemin%tmp.txt) do set numligne=%%i

rem on en profite pour verifier que quelque chose a bien ete trouve
if "%numligne%" == "" goto rientrouvee

rem on recupere le numero de ligne dans la chaine: [numeros de ligne]valeur recherchee
set numligne=%numligne:~1,1%
set /a numligne=numligne-1

rem creation d'un fichier temporaire a partir du fichier source  mais sans la ligne trouvée
type %chemin%LeVillageGaulois.txt | find /v /i "milou" > %chemin%tmp.txt

rem on efface le fichier source.
del %chemin%LeVillageGaulois.txt

rem on boucle sur toute les lignes du fichier temporaire en passant chaque ligne en parametre a la subroutine (%%i)
set compteur = 1
for /f %%i in (%chemin%tmp.txt) do call :subroutine %%i

rem la boucle est terminee on efface le fichier temporaire
del %chemin%tmp.txt
echo modification terminee
pause
goto fin

:rientrouvee
del %chemin%tmp.txt
echo la ligne recherchee n'a pu etre trouvee
pause
goto fin

:subroutine
rem on recree le fichier source avec chaque ligne du fichier temporaire via le parametre %1
echo %1 >> %chemin%LeVillageGaulois.txt
set /a compteur=compteur+1
rem si compteur est = au numero de ligne qui precede la ligne a remplacer on ajoute la nouvelle ligne
if %compteur% == %numligne% echo Idefix >> %chemin%LeVillageGaulois.txt

:fin
rem @33ddI7IHd
--------------------------------------------------------------
Quelques explications :

Pourquoi : type %chemin%LeVillageGaulois.txt | find /n /i "milou" > %chemin%tmp.txt
et pas directement : find /n /i "milou" %chemin%LeVillageGaulois.txt > %chemin%tmp.txt

et bien la premiere solution renvoi :

[3]Milou

alors que la 2ieme solution renvoi :

---------- C:\TEMP\TEST.TXT
[3]Milou

la premiere solution sera evidemment plus simple a gerer vu qu'elle renvoi directement ce qui nous interesses.

comment ca marche :
la commande type liste le contenu du fichier specifier, puis le signe de redirection | (appele pipe) redirige le resultat de la commande type sur la commande find. Cette commande find va alors chercher ligne par ligne la chaîne qui nous interesses.
Ici la nuance est que la premiere solution fait une recherche ligne par ligne alors que la deuxieme solution fait une recherche sur le fichier.
les options de la commande find utilisées dans ce batch:
/V Affiche toutes les lignes ne contenant pas la chaîne spécifiée.
/N Affiche les numéros de ligne avec les lignes affichées.(les lignes qui contiennent la chaîne recherchée)
/I Ignore la casse lors de la recherche de la chaîne.

A+

33ddI7IHd

Re: Remplacer une chaine de caractères dans un fichier text

Posté : 30 oct. 2008 19:43
par flox
Bonjour,

et merci d'avoir partagé votre batch, qui je pense sera utile pour nombre d'entre nous.

Cdl

Re: Remplacer une chaine de caractères dans un fichier texte

Posté : 11 mars 2009 12:49
par Cyboulette
Tiens, tiens, cette subroutine a l'air super intéressante, je crois que je vais enfin pouvoir résoudre mon problème, merci d'avance !

Re: Remplacer une chaine de caractères dans un fichier texte

Posté : 08 nov. 2009 13:32
par el0ka
Bonjour, et merci pour ce code qui m'aide bien...

Cependant j'ai du mal a l'adapté a mes besoin, j'explique :

j'ai besoin d'un batch qui me permet d'entrer (et enregistrer dans un .txt) mes horaires de travaille. il est en partie fait, ce que je n'arrive pas a faire, c'est en lui indiquant un horaire dans %var1% (ex: 14h30) si j'ai fini a cette heure, et que j'aurais du finir a 11h30, le batch me calcul automatiquement le nombre d'heure suppl (avec une soustraction), MAIS la commande set /a soustr=%var1%-%var2% ne peut pas se faire si une des deux variable contient mon "H"...

j'ai donc pensé exporter %var1% dans un fichier texte pour remplacer le "H" par une virgule "," (qui je pense doit passer pour la soustraction...) ! seulement, il faudrait découpé %var1% en trois variable (%heur%;%monh%;%min%) sur trois ligne dans le fichier .txt pour qu'il puisse etre utilisé par ton code ...

en esperant m'etre bien fait comprendre .... Voici les modif ke j'ai apporter a ton code pour l'adapté a mes besoins...

Code : Tout sélectionner

set /p h2=Tapez vos horraire de fin:
echo %h2% > vareur.txt

if not exist vareur.txt goto fin
type vareur.txt | find /n /i "h" > tmp.txt
for /f %%i in (tmp.txt) do set numligne=%%i
set numligne=%numligne:~1,1%
set /a numligne=numligne-1
type vareur.txt | find /v /i "h" > tmp.txt
del vareur.txt
set compteur = 1
for /f %%i in (tmp.txt) do call :subroutine %%i
del tmp.txt
goto montrucsuite

:subroutine
echo %1 >> vareur.txt
set /a compteur=compteur+1
if %compteur% == %numligne% echo "," >> vareur.txt
goto fin
 :fin
Il n'y a pas tout mon code, mais je pense que suis la suffis, puisque c'est lui qu'il faut adapté... je sait que ma solution se trouve dans la commande for avec un "delims" ou "token" mais j'avoue avoir toujours eu un probleme avec cette commande...

je ne connais pas du tout la sinthaxe exacte.... Merci d'avance a tous ceux qui pourront m'aider.

Re: Remplacer une chaine de caractères dans un fichier texte

Posté : 08 nov. 2009 14:11
par Laddy
bonjour
dans la logique il faut travailler avec des minutes.

Re: Remplacer une chaine de caractères dans un fichier texte

Posté : 08 nov. 2009 14:29
par el0ka
merci, mais je comprend pas trop se que sa change ? en fait, j'aimerais pouvoir entrer l'heure au formmat 14h30 et que le programme fasse la convertion seul ! (que ce soit en minutes ou chiffres decimal....) mon probleme en très résumé est de viré le "H" entrer par l'utilisateur, automatiquement !!

pouvez vous m'aider...
Merci.

Re: Remplacer une chaine de caractères dans un fichier texte

Posté : 08 nov. 2009 14:46
par Laddy
le batch ne prend pas les chiffres à virgule pour les calculs

bon courage

Re: Remplacer une chaine de caractères dans un fichier texte

Posté : 08 nov. 2009 15:25
par el0ka
Oups, c'est sur !! ben, merci pour l'infos ! je continue donc a chercher une solution.... Si quelqu'un a une idée pour faire se que je veut je suis preneur !!

Re: Remplacer une chaine de caractères dans un fichier texte

Posté : 08 nov. 2009 18:32
par el0ka
Rebonjour a tous,

toujours pour mon petit soucis est ce qu'il ya moyen de separer en plusieur variable, la valeur d'une seule variable..... (ex: var=14H30 a transformer en var1=14 var2=H var3=30)....

Merci pour tous debut de solution :( :cry:

Re: Remplacer une chaine de caractères dans un fichier texte

Posté : 15 nov. 2009 00:00
par el0ka
un pti UP s'il vous plait !! j'ai vraiment besoin d'aide, c forcement possible a faire mais je ne sait pas comment ........ Please HELP !!!!!!!!!!

Merci !