Signaler

Remplacer un caractere se trouvant en position 81 par un autre [Résolu]

Posez votre question maohi1975 15Messages postés mardi 24 mai 2016Date d'inscription 20 avril 2017 Dernière intervention - Dernière réponse le 20 avril 2017 à 23:35 par barnabe0057
Bonjour A tous ,

voici mon problème

j'ai un fichier txt.

Via un batch , j'aimerais remplacer uniquement sur la 1er ligne d'un fichier txt le caractère de la position 81 par un autre.

auriez vous un script à me proposer?

merci
Afficher la suite 
Utile
+0
plus moins
en fait j'ai cela au depart

0302 000000 0202612345678 FFFFFF F 0001230022001000 12239
0602 000000 12345678 FFFFFF SOCREDO 00024503751000610000000000082136E356523 DU 22/12/15 17469
0602 000000 12345678 FFFFFF SOCREDO 00024503751000610000000000217350E356894 DU 23/12/15 17469
0802 000000 0000000000299486

et j'aimerais obtenir cela :

0302 000000 0202612345678 FFFFFF X 0001230022001000 12239
0602 000000 12345678 FFFFFF SOCREDO 00024503751000610000000000082136E356523 DU 22/12/15 17469
0602 000000 12345678 FFFFFF SOCREDO 00024503751000610000000000217350E356894 DU 23/12/15 17469
0802 000000 0000000000299486

la cela ne se voit pas mais le F qui est remplacé par un X est bien en position 81 dans mon fichier TXT
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Essaie ça :

@echo off
Setlocal enableextensions enabledelayedexpansion

cd %USERPROFILE%\Desktop

:debut
cls
set /p source="Nom du fichier a traiter : "
if not exist %source% goto :debut

set destination=fichier2.txt
set /a pos=1

for /f %%A in (%source%) do (
set ligne=%%A
if !pos! EQU 1 (call :action) else (echo !ligne! >> %destination%)
set /a pos=!pos!+1
)

:: del /F %source%

Endlocal

exit

:action
set partie1=!ligne:~0,80!
set reste=!ligne:~81!
echo !partie1!X!reste! > %destination%
goto :eof
rem
Donnez votre avis
Utile
+0
plus moins
merci pour ta reponse barnabe mais je n ai pas reussi.
j ai copié ton script dans un fichier bat que j ai nommé changement.bat et je l ai copié sous c:/vini dans mon pc. c est aussi a cet endroit que se situe mon fichier source test.txt que je veux modifier grace a ton aide.

quand j execute changement.bat la fenetre invite de commande s execute et il y a ecrit test.txt . c est tout ce qui se passe.on dirait qu il ne trouve pas le fichier test.txt.

dans ton script je vois qu a un moment il y a
cd %USERPROFILE%\Desktop

j ai donc deplace le fichier test.txt sur mon bureau. mais meme chose quand je reexecute le bat

dans ton script j ai biennsur remplacé "Nom du fichier a traiter : " par test.txt

est ce que j ai fait un erreur ?
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 15 avril 2017 à 14:28
Tu as certainement fait une erreur, essaie comme ça :

@echo off
Setlocal enableextensions enabledelayedexpansion

cd %USERPROFILE%\Desktop

:debut
cls
set source=C:\vini\test.txt
if not exist %source% goto :eof

set destination=fichier2.txt
set /a pos=1

for /f "tokens=*" %%A in (%source%) do (
set ligne=%%A
if !pos! EQU 1 (call :action) else (echo !ligne! >> %destination%)
set /a pos=!pos!+1
)

:: del /F %source%

notepad !destination!

Endlocal

exit

:action
set partie1=!ligne:~0,80!
set reste=!ligne:~81!
echo !partie1!X!reste! > %destination%
goto :eof
rem
Répondre
maohi1975- 18 avril 2017 à 19:36
bonjour Barnabe ,

excuse moi je viens de rentrer de week end.

je teste tout de suite et merci pour ton aide.
Répondre
maohi1975 15Messages postés mardi 24 mai 2016Date d'inscription 20 avril 2017 Dernière intervention barnabe0057 - 18 avril 2017 à 19:44
Ca fonctionne Barnabé , tu m'aides énormément. Merci pour tout.
Répondre
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 18 avril 2017 à 20:59
De rien ;)
Répondre
Donnez votre avis
Utile
+0
plus moins
Encore une demande :-)

Est ce qu'il serait possible de faire en sorte que le fichier test.txt de départ soit modifié par le batch.

je m'explique :
quand j'exécute le batch mon fichier final reste test.txt (il conserve le nom de fichier d'origine) avec la modif faite ?

actuellement si j'exécute le bat cela me fait la modif dans un autre fichier que je dois enregistrer ensuite.
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 18 avril 2017 à 21:03
On ne peut pas directement modifier test.txt, mais on peut écraser son contenu avec le contenu du nouveau fichier :

@echo off
Setlocal enableextensions enabledelayedexpansion

:debut
cls
set source=C:\vini\test.txt
if not exist %source% goto :eof

set destination=C:\vini\fichier0123456.txt
set /a pos=1

for /f "tokens=*" %%A in (%source%) do (
set ligne=%%A
if !pos! EQU 1 (call :action) else (echo !ligne! >> %destination%)
set /a pos=!pos!+1
)

type !destination! > %source%
del /F !destination!

Endlocal
exit

:action
set partie1=!ligne:~0,80!
set reste=!ligne:~81!
echo !partie1!X!reste! > %destination%
goto :eof
rem
Répondre
Donnez votre avis
Utile
+0
plus moins
yep nickel cela fonctionne mais est ce que ton bat pourrait traiter n'importe quel nom de fichier txt se trouvant dans le répertoire vini sachant qu'il n'y en aura qu'un seul.

Je veux dire que le nom de fichier a traiter dans C:\vini ne sera pas forcement test.txt , son nom sera toujours different mais aura toujours une extension txt.
Normalement il n'y aura jamais deux fichiers txt dans le répertoire C:\vini

et pour finir peut on intégrer dans ton bat le déplacement du fichier modifié comme il faut dans C:\vini\histo afin qu'il n'y ai plus de fichier txt dans C:\vini

voila normalement ce sera ma dernière demande mais je ne sais pas si ma demande est claire.
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 18 avril 2017 à 22:57
Oui
Répondre
Donnez votre avis
Utile
+0
plus moins
Barnabé , en repompant tout sur toi j'ai fait cette petite modif qui me permet de vider le repertoire vini et de deplacer le fichier modifié dans C:\vini\histo
sauf que fichier2 est toujours ecrasé par le suivant si j'utilise ton batch deux fois de suite.
alors que je voudrais incrementer les déplacements dans histo
fichier1.txt
fichier2.txt
fichier3.txt
afin de conserver l'historique

@echo off
Setlocal enableextensions enabledelayedexpansion

cd %USERPROFILE%\Desktop

:debut
cls
set source=C:\vini\*.txt
if not exist %source% goto :eof

set destination=C:\vini\histo\fichier2.txt
set /a pos=1

for /f "tokens=*" %%A in (%source%) do (
set ligne=%%A
if !pos! EQU 1 (call :action) else (echo !ligne! >> %destination%)
set /a pos=!pos!+1
)

:: del /F %source%

notepad !destination!

del C:\vini\*.txt

Endlocal

exit

:action
set partie1=!ligne:~0,80!
set reste=!ligne:~81!
echo !partie1!X!reste! > %destination%
goto :eof
rem

delete C:\vini\*.txt
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 19 avril 2017 à 16:47
J'espère que ça te conviendra :

@echo off
Setlocal enableextensions enabledelayedexpansion

set source=C:\vini
if not exist %source% goto :eof

set historique=%source%\histo
if not exist %historique% mkdir %historique%

set temporaire="%USERPROFILE%\fichier0123456.txt"
if exist %temporaire% del /F %temporaire%

rem
rem
rem

if %source:~0,2% EQU %CD:~0,2% (cd %source% || goto :eof) else (cd /d %source% || goto :eof)
set /a nb=0

for /f "tokens=*" %%A in ('dir /b "*.txt"') do (
set texte=%%A
call :traiter
call :numeroter
type %temporaire% > %historique%\!fichier!
del /F %temporaire%
)

del /F "%source%\*.txt"
explorer /select,"%historique%"

Endlocal
exit

rem
rem
rem

:traiter
set /a pos=1
for /f "tokens=*" %%Z in (!texte!) do (
set ligne=%%Z
if !pos! EQU 1 (call :remplacer)
if !pos! GTR 1 (echo !ligne! >> %temporaire%)
set /a pos=!pos!+1
)
goto :eof

:remplacer
set partie1=!ligne:~0,80!
set reste=!ligne:~81!
echo !partie1!X!reste! > %temporaire%
goto :eof

:numeroter
set /a nb=!nb!+1
set fichier=fichier!nb!.txt
if exist %historique%\!fichier! (call :numeroter)
goto :eof
rem

Cette version va plus loin, elle traite tous les fichiers texte présents dans le dossier c:\vini, et incrémente les noms de fichiers résultants dans c:\vini\histo
Répondre
maohi1975 15Messages postés mardi 24 mai 2016Date d'inscription 20 avril 2017 Dernière intervention - 20 avril 2017 à 03:29
Alors la c'est royal , je ne sais même plus quoi te demander :-)

Je te remercie sincèrement pour le temps et aussi l'efficacité avec laquelle tu as résolu haut les mains tous mes problèmes.

Je peux clore positivement ce sujet.
Répondre
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 20 avril 2017 à 10:23
Ok c'est cool si ça marche comme tu veux.

Bonne journée et à bientôt peut-être.
Répondre
Donnez votre avis
Utile
+0
plus moins
Salut Barnabe

Je crois qu'on est déjà bientôt :-)

si t'es toujours motivé pour m'aider , l'archivage ne convient plus

on archive toujours dans C:\vini\histo mais actuellement on le faisait avec fichier1.txt
fichier2.txt
etc

C'est exactement ce que je t'avais demandé et donc t'y es pour rien. :-)

mais pour que ca convienne à la banque il faudrait archiver les fichiers de départ traités en conservant le nom d'origine du fichier et en ajoutant X devant le nom d'origine.

Exemple
un fichier ooo.txt arrive dans C:\vini , on le traite via le batch (on supprime le F en position 81 pour le remplacer par un X) et on l'historise dans C:\vini\histo sous le nom Xooo.txt
un fichier iau.txt arrive dans C:\vini on le traite et on l'historise avec le nom Xiau.txt

en fait le nom du fichier source qui arrive dans le repertoire c:\vini que l'on doit traiter change tout le temps mais la structure du fichier elle ne change jamais.

voila pour ce nouveau et j'espère dernier défi.
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 20 avril 2017 à 20:47
C'est jouable, je te tiens au courant.
Répondre
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 20 avril 2017 à 22:32
Voilà c'était pas compliqué :

@echo off
Setlocal enableextensions enabledelayedexpansion

set source=C:\vini
if not exist %source% (goto :eof)

set historique=%source%\histo
if not exist %historique% (mkdir %historique%)

set temporaire="%USERPROFILE%\fichier0123456.txt"
if exist %temporaire% (del /F %temporaire%)

rem
rem
rem

if %source:~0,2% EQU %CD:~0,2% (cd %source% || goto :eof) else (cd /d %source% || goto :eof)

for /f "tokens=*" %%A in ('dir /b "*.txt"') do (
set texte=%%A
call :traiter
call :doublon
type %temporaire% > "%historique%\!texte!"
del /F %temporaire%
)

del /F /Q "%source%\*.txt"
explorer /select,"%historique%"

Endlocal
exit

rem
rem
rem

:traiter
set /a pos=1
for /f "usebackq tokens=*" %%Z in ("!texte!") do (
set ligne=%%Z
if !pos! EQU 1 (call :remplacer)
if !pos! GTR 1 (echo !ligne! >> %temporaire%)
set /a pos=!pos!+1
)
goto :eof

:remplacer
set partie1=!ligne:~0,80!
set reste=!ligne:~81!
echo !partie1!X!reste! > %temporaire%
goto :eof

:doublon
set "texte=X!texte!"
if exist "%historique%\!texte!" (goto :doublon)
goto :eof
rem

En cas de détection de doublons, le nouveau fichier crée aura un X supplémentaire en plus du X demandé, et ainsi de suite ...

Ca évite des comportements inattendus ou bien des pertes de données par écrasement.
Répondre
maohi1975 15Messages postés mardi 24 mai 2016Date d'inscription 20 avril 2017 Dernière intervention - 20 avril 2017 à 22:39
Salut Barnabé ,

Je viens de tester ton nouveau batch ,

Au niveau de l'archivage c'est exactement ce que je voulais
Par contre au niveau du traitement il y a un plantage car le fichier d'origne est modifié , il ne reste que le nom du fichier source à l'interieur du fichier. il n'y a plus de remplacement de la lettre F par la lettre X.

tu dois pas etre tres loin...mais pour moi c'est infaisable
Répondre
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 20 avril 2017 à 22:47
J'ai trouvé, j'ai corrigé mon script dans le message précédent.

J'avais rajouté des " dans la boucle for mais j'avais oublié de rajouter usebackq.
Répondre
Donnez votre avis
Utile
+0
plus moins
Yep ca fonctionne Barnabé.

Ca doit etre terminé maintenant puisque la demande est comblée.

Je vais m'ennuyer sans toi :-)

cbianchi1975@outlook.fr je vis a Tahiti si tu veux gouter a notre vanille local je peux t'en envoyer pour le service rendu ou autre... ;-)
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 20 avril 2017 à 22:59
Ca serait génial mais te casse pas la tête, un simple "merci" suffit.

Je te rajoute à mon carnet d'adresses, si tu veux mon adresse électronique clique sur mon pseudo.

Ca doit être bien joli ton île, tu as de la chance.
Répondre
maohi1975 15Messages postés mardi 24 mai 2016Date d'inscription 20 avril 2017 Dernière intervention - 20 avril 2017 à 23:06
Je t'ai ecrit sur ton mail.

On peut clore le sujet ici ;-) le CAC a accepté ton script

MERCI
Répondre
barnabe0057 10122Messages postés lundi 2 mars 2009Date d'inscription ContributeurStatut 24 avril 2017 Dernière intervention - 20 avril 2017 à 23:35
De rien, c'est quoi le CAC ?
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !