[DOS] extraire une chaîne de caractére d'un fichier texte
grimmy33
Messages postés
15
Date d'inscription
Statut
Membre
Dernière intervention
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je m'explique : je cherche à extraire un caractère à un endroit bien précis dans un fichier texte.
contenu du fichier exemple.txt
<TR>
<TD>FBDC410 </TD>
<TD align=right>1 </TD>
<TD align=right>0 </TD></TR>
<TR>
<TD>HD2 </TD>
<TD align=right>3 </TD>
<TD align=right>1 </TD></TR>
<TR>
Je cherche à extraire dans une variable le caractère ou est localisé le chiffre 1 après la chaîne "HD2" (ce fichier est extrait d'un autre programme et ce chiffre peut être différent de 1)
pour le moment, j'en suis là :
---------------------
@echo off
cls
FOR /F "usebackq tokens=3 delims=>" %%i IN ('type C:temp\exemple.txt ^|FIND /C "HD2"') DO SET nombre=%%i
echo %nombre%
pause
---------------------
ça ne marche pas, et je bloque vraiment... Si quelqu'un peut m'aider.
Merci bien.
Amicalement,
Grimmy
je m'explique : je cherche à extraire un caractère à un endroit bien précis dans un fichier texte.
contenu du fichier exemple.txt
<TR>
<TD>FBDC410 </TD>
<TD align=right>1 </TD>
<TD align=right>0 </TD></TR>
<TR>
<TD>HD2 </TD>
<TD align=right>3 </TD>
<TD align=right>1 </TD></TR>
<TR>
Je cherche à extraire dans une variable le caractère ou est localisé le chiffre 1 après la chaîne "HD2" (ce fichier est extrait d'un autre programme et ce chiffre peut être différent de 1)
pour le moment, j'en suis là :
---------------------
@echo off
cls
FOR /F "usebackq tokens=3 delims=>" %%i IN ('type C:temp\exemple.txt ^|FIND /C "HD2"') DO SET nombre=%%i
echo %nombre%
pause
---------------------
ça ne marche pas, et je bloque vraiment... Si quelqu'un peut m'aider.
Merci bien.
Amicalement,
Grimmy
A voir également:
- [DOS] extraire une chaîne de caractére d'un fichier texte
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Extraire une video youtube - Guide
- Caractère ascii - Guide
6 réponses
on compte les lignes, quand on trouve HD2 on garde le n° de ligne+2, quand on atteint cette ligne, on affiche
essayer:
essayer:
@echo off
set l=0
set c=1
setlocal enabledelayedexpansion
for /f "tokens=2 delims=<>" %%a In (fichier.txt) Do (
echo %%a | findstr HD2 > NUL
if !errorlevel! EQU 0 set /a l=!c!+2
if !c! EQU !l! echo %%a
set /a c+=1
)
merci pour la réponse.
mais là tu dépasses mes compétences. peux-tu m'expliquer un peu la syntaxe ?
j'ai copie/colle ton code, cela n'a pas l'air de fonctionner sur ma machine.
j'ai ajouté :
echo %%a
pause
à la fin pour essayer de visualiser la valeur prise...
résultat :
affichage "%a" autant dire que je ne suis pas doué...
mais là tu dépasses mes compétences. peux-tu m'expliquer un peu la syntaxe ?
j'ai copie/colle ton code, cela n'a pas l'air de fonctionner sur ma machine.
j'ai ajouté :
echo %%a
pause
à la fin pour essayer de visualiser la valeur prise...
résultat :
affichage "%a" autant dire que je ne suis pas doué...
montre le code
setlocal enabledelayedexpansion
nécessaire pour modifier des variables dans une boucle FOR qui seront identifiées entre !! et pas %%
for /f "tokens=2 delims=<>" %%a In (fichier.txt) Do (
on récupère le 2ème champ de chaque ligne, les champs sont séparés par < ou >
echo %%a | findstr HD2 > NUL
on teste si le champ contient HD2, findstr met dans errorlevel 0 si oui, 1 si non
if !errorlevel! EQU 0 set /a l=!c!+2
errorlevel = 0, donc le champ contient HD2, on met dans l le n° de la ligne + 2
if !c! EQU !l! echo %%a
si le n° de la ligne = l, on est 2 lignes après HD2, on imprime le champ 2
set /a c+=1
on incrémente le compteur de ligne
)
PS: je ne teste pas "%%a" == "HD2" à cause des espaces
setlocal enabledelayedexpansion
nécessaire pour modifier des variables dans une boucle FOR qui seront identifiées entre !! et pas %%
for /f "tokens=2 delims=<>" %%a In (fichier.txt) Do (
on récupère le 2ème champ de chaque ligne, les champs sont séparés par < ou >
echo %%a | findstr HD2 > NUL
on teste si le champ contient HD2, findstr met dans errorlevel 0 si oui, 1 si non
if !errorlevel! EQU 0 set /a l=!c!+2
errorlevel = 0, donc le champ contient HD2, on met dans l le n° de la ligne + 2
if !c! EQU !l! echo %%a
si le n° de la ligne = l, on est 2 lignes après HD2, on imprime le champ 2
set /a c+=1
on incrémente le compteur de ligne
)
PS: je ne teste pas "%%a" == "HD2" à cause des espaces
alors après bidouillage, la boucle à l'air de fonctionner.
par contre impossible d'afficher la valeur de %%a
en fait je dois comparer cette valeur à une reference.
A priori, je n'arrive pas a exploiter le contenu de la variable a...
@echo off
set l=0
set c=1
setlocal enabledelayedexpansion
for /f "tokens=2 delims=<>" %%a In (fichier.txt) Do (
echo %%a | findstr HD2 > NUL
if !errorlevel! EQU 0 set /a l=!c!+2
if !c! EQU !l! echo %%a
set /a c+=1
)
if %%a geq 2 goto reussi
goto rate
:reussi
echo essai reussi
pause
exit
:rate
echo essai rate
pause
exit
J'ai une autre question de comprehension :
que ce soit la chaine HD2, ou la valeur que je cherche, ils sont situés derrière le premier signe > de la ligne.
dans ce cas, l'option delims ne devrait pas être => au lieu de =<> ?
(j'ai essayé ça na marche pas, donc c'est que je n 'ai pas compris)
par contre impossible d'afficher la valeur de %%a
en fait je dois comparer cette valeur à une reference.
A priori, je n'arrive pas a exploiter le contenu de la variable a...
@echo off
set l=0
set c=1
setlocal enabledelayedexpansion
for /f "tokens=2 delims=<>" %%a In (fichier.txt) Do (
echo %%a | findstr HD2 > NUL
if !errorlevel! EQU 0 set /a l=!c!+2
if !c! EQU !l! echo %%a
set /a c+=1
)
if %%a geq 2 goto reussi
goto rate
:reussi
echo essai reussi
pause
exit
:rate
echo essai rate
pause
exit
J'ai une autre question de comprehension :
que ce soit la chaine HD2, ou la valeur que je cherche, ils sont situés derrière le premier signe > de la ligne.
dans ce cas, l'option delims ne devrait pas être => au lieu de =<> ?
(j'ai essayé ça na marche pas, donc c'est que je n 'ai pas compris)
if %%a geq 2 est en dehors de la boucle après ) donc %%a a perdu sa valeur, faire
if !c! EQU !l! set x=%%a
...
if %x% geq 2 goto reussi
pour le délimiteur, prendre > ou <> est au choix, avec seulement >, le < sera dans la variable, exemple:
if !c! EQU !l! set x=%%a
...
if %x% geq 2 goto reussi
pour le délimiteur, prendre > ou <> est au choix, avec seulement >, le < sera dans la variable, exemple:
C:> for /f "tokens=2 delims=>" %a in ("<1><2><3>")do @echo %a
<2
C:> for /f "tokens=2 delims=><" %a in ("<1><2><3>")do @echo %a
2
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour à tous,
grâce à l'aide de Dubcek, ça fonctionne.
le fichier source est légèrement différent, j'ai donc dû modifier un peu ma boucle...
source
------------------
</td>
</tr>
<tr>
<td>
HD2
</td>
<td align="right">
3
</td>
<td align="right">
2
</td>
</tr>
<tr>
<td>
------------------
la velaur a extraire est le 2
le code donne :
@echo off
cls
if not exist c:\temp\lic_report_real_time.txt goto http
del c:\temp\lic_report_real_time.txt
goto http
:http
\\files\http_get.exe http://serv/lic_report_real_time.txt > c:\temp\lic_report_real_time.txt
set l=0
set c=1
setlocal enabledelayedexpansion
for /f %%a In (c:\temp\lic_report_real_time.txt) Do (
echo %%a | findstr HD2 > NUL
if !errorlevel! EQU 0 set /a l=!c!+6
if !c! EQU !l! set HD2_notfree=%%a
set /a c+=1
)
echo %HD2_notfree%
pause
if %HD2_notfree% geq 2 goto reussi
goto rate
:reussi
echo essai reussi
pause
exit
:rate
echo essai rate
pause
exit
Dernier point à régler, toutes les itérations de la boucle for apparaissent à l'écran avant d'afficher la valeur "echo %HD2_notfree%"
J'aimerai que cela disparaisse... mais je n'y arrive pas.
Une idée ?
Merci de votre aide
grâce à l'aide de Dubcek, ça fonctionne.
le fichier source est légèrement différent, j'ai donc dû modifier un peu ma boucle...
source
------------------
</td>
</tr>
<tr>
<td>
HD2
</td>
<td align="right">
3
</td>
<td align="right">
2
</td>
</tr>
<tr>
<td>
------------------
la velaur a extraire est le 2
le code donne :
@echo off
cls
if not exist c:\temp\lic_report_real_time.txt goto http
del c:\temp\lic_report_real_time.txt
goto http
:http
\\files\http_get.exe http://serv/lic_report_real_time.txt > c:\temp\lic_report_real_time.txt
set l=0
set c=1
setlocal enabledelayedexpansion
for /f %%a In (c:\temp\lic_report_real_time.txt) Do (
echo %%a | findstr HD2 > NUL
if !errorlevel! EQU 0 set /a l=!c!+6
if !c! EQU !l! set HD2_notfree=%%a
set /a c+=1
)
echo %HD2_notfree%
pause
if %HD2_notfree% geq 2 goto reussi
goto rate
:reussi
echo essai reussi
pause
exit
:rate
echo essai rate
pause
exit
Dernier point à régler, toutes les itérations de la boucle for apparaissent à l'écran avant d'afficher la valeur "echo %HD2_notfree%"
J'aimerai que cela disparaisse... mais je n'y arrive pas.
Une idée ?
Merci de votre aide
bonjour,
c'est bien ce qui me semblait...
J'ai une alternance d'affichage de "le fichier specifie est introuvable" et "la syntaxe de la commande n'est pas correcte" . mais la derniere ligne affichée correspond bien à la valeur attendue.
tous les affichages correspondent à priori aux intérations de la boucle for...
Comme tu as pu lire dans mon message, le format du fichier source a change. Donc j'ai supprimé l'option tokens/delims de la boucle...
c'est bien ce qui me semblait...
J'ai une alternance d'affichage de "le fichier specifie est introuvable" et "la syntaxe de la commande n'est pas correcte" . mais la derniere ligne affichée correspond bien à la valeur attendue.
tous les affichages correspondent à priori aux intérations de la boucle for...
Comme tu as pu lire dans mon message, le format du fichier source a change. Donc j'ai supprimé l'option tokens/delims de la boucle...
Bonjour à tous.
désolé mais je reviens à la charge.
Mes "amis" informaticiens" ayant changé le format source de ma donnée, j'ai modifié mon batch en conséquence...
Mais ça ne fonctionne pas.
Si quelqu'un peut (encore) m'aider... décidément cette boucle for do me cause bien des soucis... :-p
source
------
Produit Nb Lic MAXI Nb Lic Prises
--------------- ----------- -------------
AD 2 0
CD 90 13
V10 13 0
DV1 1 0
Infras 62 13
F410 1 0
HD2 4 2
MD1 15 1
MD2 20 14
SA2 1 0
SMD 6 0
CODE
-----
setlocal enabledelayedexpansion
for /f "tokens=9 delims= " %%a In (c:\temp\report.txt) Do (
echo %%a | findstr HD2 > NUL
if !errorlevel! EQU 0 set HD2_notfree=%%a
)
echo %HD2_notfree%
pause
if %HD2_notfree% geq 2 goto reussi
goto rate
:reussi
echo essai reussi
pause
exit
:rate
echo essai rate
pause
exit
Merci de votre aide
désolé mais je reviens à la charge.
Mes "amis" informaticiens" ayant changé le format source de ma donnée, j'ai modifié mon batch en conséquence...
Mais ça ne fonctionne pas.
Si quelqu'un peut (encore) m'aider... décidément cette boucle for do me cause bien des soucis... :-p
source
------
Produit Nb Lic MAXI Nb Lic Prises
--------------- ----------- -------------
AD 2 0
CD 90 13
V10 13 0
DV1 1 0
Infras 62 13
F410 1 0
HD2 4 2
MD1 15 1
MD2 20 14
SA2 1 0
SMD 6 0
CODE
-----
setlocal enabledelayedexpansion
for /f "tokens=9 delims= " %%a In (c:\temp\report.txt) Do (
echo %%a | findstr HD2 > NUL
if !errorlevel! EQU 0 set HD2_notfree=%%a
)
echo %HD2_notfree%
pause
if %HD2_notfree% geq 2 goto reussi
goto rate
:reussi
echo essai reussi
pause
exit
:rate
echo essai rate
pause
exit
Merci de votre aide