[DOS] extraire une chaîne de caractére d'un fichier texte

Fermé
grimmy33 Messages postés 15 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015 - 3 juin 2015 à 17:24
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 15 juil. 2015 à 15:49
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
3 juin 2015 à 17:26
rectif, ce serait tokens=4 et non 3...
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
4 juin 2015 à 08:20
hello
est-ce toujours 2 lignes après HD2 ?
0
grimmy33 Messages postés 15 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
4 juin 2015 à 09:42
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
4 juin 2015 à 11:10
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
4 juin 2015 à 17:24
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 5/06/2015 à 09:17
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
5 juin 2015 à 09:41
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
5 juin 2015 à 10:13
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
5 juin 2015 à 11:08
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
8 juin 2015 à 15:59
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 juin 2015 à 08:35
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
9 juin 2015 à 09:25
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 juin 2015 à 09:49
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
9 juin 2015 à 10:52
OK,
avec tokens=1 delims=<> ca fonctionne !
Merci encore pour ton aide !
0
grimmy33 Messages postés 15 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
15 juil. 2015 à 09:14
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
15 juil. 2015 à 09:15
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 juil. 2015 à 09:51
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 mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
15 juil. 2015 à 10:03
oui c'est cela, je dois récupérer la valeur correspondant au "2"
0
grimmy33 Messages postés 15 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 15 juillet 2015
15 juil. 2015 à 10:08
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 15/07/2015 à 10:55
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