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

grimmy33 Messages postés 16 Statut Membre -  
dubcek Messages postés 18627 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

6 réponses

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

    oui, la position relative entre la valeur cherchée et la chaîne "HD2" est toujours la même
    0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    1. grimmy33 Messages postés 16 Statut Membre
       
      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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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
    3. grimmy33 Messages postés 16 Statut Membre
       
      super !
      merci beaucoup pour ton aide.
      Je vais me replonger dans le sujet et je te tiens au courant.
      0
    4. grimmy33 Messages postés 16 Statut Membre
       
      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
    5. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. grimmy33 Messages postés 16 Statut Membre
     
    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
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      quel texte s'affiche ? avec le @echo off et le >NUL, rien ne devrait s'afficher
      0
    2. grimmy33 Messages postés 16 Statut Membre
       
      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
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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
    4. grimmy33 Messages postés 16 Statut Membre
       
      OK,
      avec tokens=1 delims=<> ca fonctionne !
      Merci encore pour ton aide !
      0
  7. grimmy33 Messages postés 16 Statut Membre
     
    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
    1. grimmy33 Messages postés 16 Statut Membre
       
      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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      mettre le texte entre balises <> pour garder les tabulations
      il faut récupérer le 2 de la ligne HD2 4 2 ?
      0
    3. grimmy33 Messages postés 16 Statut Membre
       
      oui c'est cela, je dois récupérer la valeur correspondant au "2"
      0
    4. grimmy33 Messages postés 16 Statut Membre
       
      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
    5. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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