[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
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
A voir également:
- [DOS] extraire une chaîne de caractére d'un fichier texte
- Fichier rar - Guide
- Caractère ascii - Guide
- Fichier host - Guide
- Extraire une video youtube - Guide
- Fichier iso - Guide
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
3 juin 2015 à 17:26
rectif, ce serait tokens=4 et non 3...
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
4 juin 2015 à 08:20
hello
est-ce toujours 2 lignes après HD2 ?
est-ce toujours 2 lignes après HD2 ?
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
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
oui, la position relative entre la valeur cherchée et la chaîne "HD2" est toujours la même
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
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:
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
)
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
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é...
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é...
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
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
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
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
5 juin 2015 à 09:41
super !
merci beaucoup pour ton aide.
Je vais me replonger dans le sujet et je te tiens au courant.
merci beaucoup pour ton aide.
Je vais me replonger dans le sujet et je te tiens au courant.
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
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)
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)
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
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:
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
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
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
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
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
9 juin 2015 à 08:35
quel texte s'affiche ? avec le @echo off et le >NUL, rien ne devrait s'afficher
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
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...
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...
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
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
remettre le delims=<> va les supprimer
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
9 juin 2015 à 10:52
OK,
avec tokens=1 delims=<> ca fonctionne !
Merci encore pour ton aide !
avec tokens=1 delims=<> ca fonctionne !
Merci encore pour ton aide !
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
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
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
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
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...
chaque ligne comporte 3 chaines de caractères (1 identifiant puis 2 nombres) séparées par un certain nombre de tabulations...
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
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 ?
il faut récupérer le 2 de la ligne HD2 4 2 ?
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
15 juil. 2015 à 10:03
oui c'est cela, je dois récupérer la valeur correspondant au "2"
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
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...
cela me premettrait de limiter les commutateurs à "tokens=3" ...
je n'ai pas trouvé comment faire pour du DOS...
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
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
)
...
...