Supprimer un caractère dans un fichier texte avec .bat

Fermé
adeline_jolie Messages postés 2 Date d'inscription samedi 19 octobre 2013 Statut Membre Dernière intervention 26 octobre 2013 - 19 oct. 2013 à 18:00
 Dev1 - 23 déc. 2015 à 06:09
Bonjour à Tous,

J'ai un fichier texte (prog.txt) qui est comme suit :

N5 x50.
N10 y25.
N1000 g50

et je voudrai créer un fichier .bat pour

1) supprimer "Tous les mots commençant par Nxxxx"
2) supprimer tous les points en fin de ligne
3) supprimer des caractères indésirable comme g50

Le fichier final resemblerai à :

x50
y25

Merci d'avance pour votre expériance
A voir également:

4 réponses

bricomachin Messages postés 244 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 6 septembre 2016 133
25 oct. 2013 à 13:21
Salut,

Voici un code qui devrait te permettre de corriger ton fichier...
@echo off

if exist "progCorrige.txt" (
color 0c
echo Erreur: le fichier progCorrige.txt existe d'j... !
pause
exit
)

if not exist "prog.txt" (
color 0c
echo Erreur: le fichier prog.txt n'existe pas !
pause
exit
)

setlocal ENABLEDELAYEDEXPANSION

set ligne=""

REM découpe chaque ligne du fichier texte
for /f "delims=" %%a in ('type prog.txt') do (

set ligne=%%a
REM Cette ligne enlève le point en fin de ligne si il existe
if "!ligne:~-1!"=="." set ligne=!ligne:~0,-1!

rem découpe mot-à-mot
for /f "tokens=1*" %%b in ("!ligne!") do (

set noLigne=%%b

REM si le 1er mot commence par N, on ne le prend pas en compte
if "!noLigne:~0,1!"=="N" set ligne=%%c

)
echo !ligne!>>progCorrige.txt

if exist "progCorrige.txt" (
color 0A
echo Le fichier corrig' a bien 't' cr'' !
pause
exit
)
)

pause

endlocal




C'est du code ISO ton fichier si je ne m'abuse, tu fais quoi ? du tournage, fraisage ou autre ? Simple curiosité ^^

@+


Bricomachin
1
bricomachin Messages postés 244 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 6 septembre 2016 133
25 oct. 2013 à 14:10
Par contre je me rends compte qu'il y a un petit problème d'encodage qui fait que les messages n'auront pas d'accents...
0
adeline_jolie Messages postés 2 Date d'inscription samedi 19 octobre 2013 Statut Membre Dernière intervention 26 octobre 2013
26 oct. 2013 à 01:02
Bonjour Bricomachin,

Merci de m'avoir avancé un peu plus.... ça ne marche pas encore... mais on s'approche.... lol

le fichier final ne ressemble pas à :
x50
y25

Mais tu m'a donner une bonne base de travail....lol
j'ai pas compris setlocal ENABLEDELAYEDEXPANSION

Aurai tu un peu de temps pour complèter.... Merci d'avance
0
Bonjour bricomachin

j'ai un soucis qui ressemble à celui d 'Aadeline_jolie

J'ai un fichier dont les lignes ressemblent à ceci
"id"; "user"; ''login"; ....

Je voudrais savoir si c'est possible de supprimer tous les guillemets de chaque ligne.

Merci pour ton aide
0
bricomachin Messages postés 244 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 6 septembre 2016 133
7 nov. 2013 à 00:02
Salut,

Alors premièrement, je suis désolé de ne pas avoir vu ton message plus tôt.
J'ai testé le fichier à la maison et il me donne x50 et c'est tout. C'est bizarre car j'avais réussi à bien formater le fichier une fois...

Bon je vais remodifier le fichier et te le ré-envoyer.

Et si jamais setlocal ENABLEDELAYEDEXPANSION est une instruction très pratique pour résoudre les problèmes de SET dans des FOR et des IF par exemple.
En l'occurrence je l'utilise pour pouvoir faire un SET dans une boucle sans que ce ne soit toujours la première valeur qui soit retournée.

Un petit exemple pour te rendre compte:
@echo off

echo le set dans le if ne fonctionne pas
set test=Fail
if 1==1 (
set test=Marche
echo test : %test%
pause
)


echo.
echo.
echo mais hors du if il fonctionne
set test2=Fail
if 1==1 (
set test2=Marche
)
echo test2 : %test2%
pause



setlocal ENABLEDELAYEDEXPANSION

echo.
echo.
echo le set dans le if fonctionne avec setlocal ENABLEDELAYEDEXPANSION
set test3=Fail
if 1==1 (
set test3=Marche
echo test3 : !test3!
pause
)


endlocal

Ok alors je me mets sur le truc demain au boulot je pense... mais je n'aurais peut-être l'occasion de le faire que vendredi.

De toute façon tu peux déjà potasser cette magnifique commande que setlocal ENABLEDELAYEDEXPANSION ^^


@++


Bricomachin
0
bricomachin Messages postés 244 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 6 septembre 2016 133
7 nov. 2013 à 00:04
0
bricomachin Messages postés 244 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 6 septembre 2016 133
16 nov. 2013 à 18:57
Salut,

Tout d'abord, si un programmeur Batch passe par là, ce serait cool s'il pouvait expliquer pourquoi dans le code posté ci-dessus la cause du problème est-il le
echo !ligne!>>progCorrige.txt
. En effet, après de looooongues heures à réécrire cent fois le programme et à désactiver une à une les commandes pour trouver laquelle ne jouait pas, j'ai compris que si l'on met
echo !ligne!
cela fonctionne (il affiche x50 y25 g50) mais avec
echo !ligne!>>progCorrige.txt
cela n'écrit dans le fichier que x50 !!!

Bon ensuite, pour pouvoir écrire le code ISO dans le fichier progCorrige.txt. il faut appeler le "traitement ISO.bat" dans le cmd comme ceci :
"traitement SO.bat"> progCorrige.txt 2>&1
ou alors lancer un fichier batch qui va lancer "traitement ISO.bat" et qui contient ça :
@echo off

call "traitement ISO.bat" >progCorrige.txt 2>&1
exit

Mais à ce moment, il crée progCorrige avant de lancer "traitement ISO.bat" et donc on reçoit l'erreur du fichier déjà existant dans le progCorrige.txt.

En conclusion:

Utiliser le programme :
@echo off

if not exist "prog.txt" (
color 0c
echo Erreur: le fichier prog.txt n'existe pas !
pause
exit
)
setlocal ENABLEDELAYEDEXPANSION
set ligne=""
REM découpe chaque ligne du fichier texte
for /f "delims=" %%a in (prog.txt) do (
set ligne=%%a
REM Cette ligne enlève le point en fin de ligne s'il existe
if "!ligne:~-1!"=="." set ligne=!ligne:~0,-1!
rem découpe mot-à-mot
for /f "tokens=1* delims= " %%b in ("!ligne!") do (
set noLigne=%%b
REM si le 1er mot commence par N, on ne le prend pas en compte
if "!noLigne:~0,1!"=="N" set ligne=%%c
)
echo !ligne!
)
endlocal

et l'appeler "traitement ISO.bat"

puis le lancer grâce au programme suivant :
@echo off

call "traitement ISO.bat" >progCorrige.txt 2>&1
exit

dont le nom est sans importance...


Je suis désolé d'avoir fait si long, mais c'était un problème auquel je ne m'étais jamais frotté et j'ai eu un mal de chien à le résoudre ^^.

Pourtant, je suis content d'être tombé sur ce post, déjà rien que pour enrichir mes connaissances.



En tout cas, je reste à ta disposition pour d'autres modifs/questions et te souhaite une bonne soirée.


Bricomachin
0
bricomachin Messages postés 244 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 6 septembre 2016 133
16 nov. 2013 à 18:58
Je suis en train de modifier le code pour enlever les g50 etc et ne conserver uniquement que les coordonnées...
0
bricomachin Messages postés 244 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 6 septembre 2016 133
16 nov. 2013 à 19:33
Salut,

Voici deux versions deux code qui permet de ne garder que les coordonnées:
celui-là s'il les x et y peuvent être à des endroits variables de la ligne
exemple:
N10 x50 g50 puis sur la ligne d'après :
N15 g03 y80

@echo off

if not exist "C:\Users\Romain\Desktop\prog.txt" (
color 0c
echo Erreur: le fichier prog.txt n'existe pas !
pause
exit
)
setlocal ENABLEDELAYEDEXPANSION
set ligne=""
set ligneFinale=
REM découpe chaque ligne du fichier texte
for /f "delims=" %%a in (prog.txt) do (
set ligne=%%a
REM Cette ligne enlève le point en fin de ligne s'il existe
if "!ligne:~-1!"=="." set ligne=!ligne:~0,-1!
set ligneFinale=
rem découpe mot-à-mot (je ne pense pas qu'il puisse y avoir plus de 6 arguments sur une ligne...)
for /f "tokens=1-6 delims= " %%b in ("!ligne!") do (


set noLigne=%%b
rem echo !Ligne!
REM si le mot ne commence par X ou Y, on ne le prend pas en compte
if /i "!noLigne:~0,1!"=="X" (
set ligneFinale=!noLigne!
) else (
if /i "!noLigne:~0,1!"=="Y" (
set ligneFinale=!noLigne!)
)
set noLigne=%%c
REM si le mot ne commence par X ou Y, on ne le prend pas en compte
if /i "!noLigne:~0,1!"=="X" (
set ligneFinale=!noLigne!
) else (
if /i "!noLigne:~0,1!"=="Y" (
set ligneFinale=!noLigne!)
)
set noLigne=%%d
REM si le mot ne commence par X ou Y, on ne le prend pas en compte
if /i "!noLigne:~0,1!"=="X" (
set ligneFinale=!noLigne!
) else (
if /i "!noLigne:~0,1!"=="Y" (
set ligneFinale=!noLigne!)
)
set noLigne=%%e
REM si le mot ne commence par X ou Y, on ne le prend pas en compte
if /i "!noLigne:~0,1!"=="X" (
set ligneFinale=!noLigne!
) else (
if /i "!noLigne:~0,1!"=="Y" (
set ligneFinale=!noLigne!)
)
set noLigne=%%f
REM si le mot ne commence par X ou Y, on ne le prend pas en compte
if /i "!noLigne:~0,1!"=="X" (
set ligneFinale=!noLigne!
) else (
if /i "!noLigne:~0,1!"=="Y" (
set ligneFinale=!noLigne!)
)
set noLigne=%%g
REM si le mot ne commence par X ou Y, on ne le prend pas en compte
if /i "!noLigne:~0,1!"=="X" (
set ligneFinale=!noLigne!
) else (
if /i "!noLigne:~0,1!"=="Y" (
set ligneFinale=!noLigne!)
)
)
if not "!ligneFinale!"=="" echo !ligneFinale!
)


endlocal
exit

et celui là si tu sais que ce sera toujours le premier argument
exemple:
N20 y80 g50
N25 x45 g03

@echo off

if not exist "C:\Users\Romain\Desktop\prog.txt" (
color 0c
echo Erreur: le fichier prog.txt n'existe pas !
pause
exit
)
setlocal ENABLEDELAYEDEXPANSION
set ligne=""
set ligneFinale=
REM découpe chaque ligne du fichier texte
for /f "delims=" %%a in (prog.txt) do (
set ligne=%%a
REM Cette ligne enlève le point en fin de ligne s'il existe
if "!ligne:~-1!"=="." set ligne=!ligne:~0,-1!
set ligneFinale=
rem découpe mot-à-mot (je ne pense pas qu'il puisse y avoir plus de 6 arguments sur une ligne...)
for /f "tokens=1,2 delims= " %%b in ("!ligne!") do (

set noLigne=%%b
rem echo !Ligne!
REM si le mot ne commence par X ou Y, on ne le prend pas en compte
if /i "!noLigne:~0,1!"=="X" (
set ligneFinale=!noLigne!
) else (
if /i "!noLigne:~0,1!"=="Y" (
set ligneFinale=!noLigne!)
)
set noLigne=%%c
REM si le mot ne commence par X ou Y, on ne le prend pas en compte
if /i "!noLigne:~0,1!"=="X" (
set ligneFinale=!noLigne!
) else (
if /i "!noLigne:~0,1!"=="Y" (
set ligneFinale=!noLigne!)
)

)
if not "!ligneFinale!"=="" echo !ligneFinale!
)

endlocal

exit




voilà,

@++


Bricomachin
0