[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   -
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

A voir également:

6 réponses

grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
rectif, ce serait tokens=4 et non 3...
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
est-ce toujours 2 lignes après HD2 ?
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

oui, la position relative entre la valeur cherchée et la chaîne "HD2" est toujours la même
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
on compte les lignes, quand on trouve HD2 on garde le n° de ligne+2, quand on atteint cette ligne, on affiche
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
)
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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é...
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
super !
merci beaucoup pour ton aide.
Je vais me replonger dans le sujet et je te tiens au courant.
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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:
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
quel texte s'affiche ? avec le @echo off et le >NUL, rien ne devrait s'afficher
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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...
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
en supprimant le delims %%a va contenir <td> donc les caractères <> de redirection du DOS, d'ou les erreurs je pense
remettre le delims=<> va les supprimer
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
OK,
avec tokens=1 delims=<> ca fonctionne !
Merci encore pour ton aide !
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
petite précision, car cela à "sauté" dans la mise en forme du message :
chaque ligne comporte 3 chaines de caractères (1 identifiant puis 2 nombres) séparées par un certain nombre de tabulations...
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
mettre le texte entre balises <> pour garder les tabulations
il faut récupérer le 2 de la ligne HD2 4 2 ?
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
oui c'est cela, je dois récupérer la valeur correspondant au "2"
0
grimmy33 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
peut-on avec le switch delims "éliminer" la prise en compte des tabulations ?
cela me premettrait de limiter les commutateurs à "tokens=3" ...
je n'ai pas trouvé comment faire pour du DOS...
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
essayer
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,3" %%a In (c:\temp\report.txt) Do (
echo %%a | findstr HD2 > NUL
if !errorlevel! EQU 0 set HD2_notfree=%%b
)
...
...
0