Problème pour extraire des informations d'un fichier

Résolu
Ka-El Messages postés 279 Statut Membre -  
Ka-El Messages postés 279 Statut Membre -
Bonjour,
Je dispose d'un fichier "catalogue.txt" qui contient un certain nombre de champs et des sauts de ligne.
Mon objectif est de soustraire certaines informations que je vais ensuite concaténer dans un autre fichier.
Pour bien comprendre, voici une partie du format de mon fichier:

Comme vous pouvez le constater, il y a des blancs devant chaque ligne.
Il s'agit donc pour moi de récupérer l'information qui se trouve devant RPART et SPART (qu'on retrouve plusieurs fois dans le fichier) et envoyer les informations dans un autre fichier.
je devrais donc obtenir un résultat comme ça:
BRIAN;JENNY
BOB;SAM
FRED;CAROLE


Pour l'instant, j'arrive à récupérer certaines données avec ce code:
@REM Collecte des informations
for /F %%a in ('dir /B catalogue.txt') do (
for /F "tokens=5 delims== " %%b in ('find "RPART" ^< %%a') do set RECV=%%b
for /F "tokens=5 delims== " %%c in ('find "SPART" ^< %%a') do set SEND=%%c
echo !RECV!;!SEND!>> %ctrlcft%
)


Mais le résultat ne me donne que la ligne suivante:
FRED;CAROLE


Auriez-vous svp des idées qui pourraient m'aider à avancer ?
Merci à vous ! :-)

2 réponses

  1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Bonjour,

    Essaie comme ceci :

    @echo off
    setlocal enableextensions enabledelayedexpansion
    chcp 28591 >nul
    color 0A

    set catalogue=%USERPROFILE%\Desktop\catalogue.txt
    set "people="
    set ctrlcft=%USERPROFILE%\Desktop\resultat.txt
    echo.> %ctrlcft%

    for /f "usebackq tokens=2-3 delims== " %%B in ("%catalogue%") do (

    set IDA=%%~B
    set IDA=!IDA: =!
    set IDA=!IDA: =!

    if "!IDA!"=="SPART" (set people=%%~C)
    if "!IDA!"=="RPART" (
    set people=!people!;%%~C
    echo !people!>> %ctrlcft%
    set "people="
    )

    )

    pause
    exit

    Attention à ces 2 lignes :

    set IDA=!IDA: =!
    set IDA=!IDA: =!

    Dans la première ligne il s'agit d'un espace entre les : et le =
    Dans la deuxième ligne il s'agit d'une tabulation entre les : et le =

    Le forum a supprimé la tabulation.

    0
    1. Ka-El Messages postés 279 Statut Membre
       
      C'est pas mal du tout !
      Par contre, si je veux ajouter un autre élément de recherche dans le script (par exemple l'information qui se trouve devant "DATED =", comment devrais-je procéder ?
      Du coup, je suppose que la partie du code devrait prendre cette forme:
      set people=!people!;%%~C;%DATED%
      echo !people!>> %ctrlcft%


      J'ai tenté quelques trucs, mais ça ne marche pas...

      En tout cas, merci beaucoup pour ton aide précieuse ! :-)
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > Ka-El Messages postés 279 Statut Membre
         
        @echo off
        setlocal enableextensions enabledelayedexpansion
        chcp 28591 >nul
        color 0A

        set catalogue=%USERPROFILE%\Desktop\catalogue.txt
        set "chaine="
        set ctrlcft=%USERPROFILE%\Desktop\resultat.txt
        echo. >%ctrlcft%

        for /f "usebackq tokens=1-2 delims==" %%A in ("%catalogue%") do (
        echo %%A = %%B
        echo %%A | findstr "SPART RPART IDF TYPE IDTU PHASESTEP DATEE TIMEE DATED TIMED" >nul && set "chaine=!chaine!^;%%B"
        echo %%A | find "TIMED" && (
        set "chaine=!chaine: =!" # on supprime les espaces
        set "chaine=!chaine: =!" # on supprime les tabulations
        set "chaine=!chaine:~1!" # on supprime le premier point-virgule
        echo !chaine! >>%ctrlcft%
        set "chaine=" # on réinitialise la variable
        )
        )

        pause
        exit
        0
    2. Ka-El Messages postés 279 Statut Membre
       
      Merci pour ton aide Barnabe0057
      Ceci dit, le script n'abouti pas. Je pense que le problème vient de la boucle qui va chercher les informations toujours sur la même position (tokens tokens=1-2 delims== ")
      Je continue à chercher de mon côté...
      0
    3. barnabe0057
       
      Il me faudrait un bout du fichier pour pouvoir tester en condition réelle.
      0
    4. Ka-El Messages postés 279 Statut Membre
       
      Salut Barnabe,
      Fichier dispo en mp
      Merci pour ton aide ! :-)
      0
  2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Est-ce que c'est mieux comme ça :

    @echo off
    setlocal enableextensions enabledelayedexpansion
    chcp 28591 >nul
    color 0A

    set catalogue=%USERPROFILE%\Desktop\catalogue.txt
    set ctrlcft=%USERPROFILE%\Desktop\resultat.txt
    set "chaine="

    echo.>%ctrlcft%

    for /f "usebackq tokens=1,2,* delims==" %%A in ("%catalogue%") do (

    echo %%A = %%B %%C
    echo %%A | findstr /C:" IDTU" >nul && (if defined chaine (call :envoi))
    echo %%A | findstr /C:" IDTU" /C:" PHASESTEP" /C:" IDF" /C:" SPART" /C:" RPART" >nul && (set "chaine=!chaine!^;%%B")
    echo %%A | findstr /C:"TYPE" | findstr /V "Protocol Filter" >nul && (set "chaine=!chaine!^;%%B")
    echo %%B | findstr /C:" DATED" /C:" DATEE" >nul && (set "chaine=!chaine!^;%%C")
    echo %%B | findstr /C:" TIMED" /C:" TIMEE" >nul && (set "chaine=!chaine!^;%%C" & if "!chaine:~-1!"=="0" (set "chaine=!chaine:~,-2!") else (set "chaine=!chaine:~,-3!"))
    )

    call :envoi

    pause
    exit

    :envoi

    set "chaine=!chaine: =!" # on supprime les espaces
    set "chaine=!chaine: =!" # on supprime les tabulations
    set "chaine=!chaine:~1!" # on supprime le premier point-virgule
    echo.!chaine!;>>%ctrlcft% & echo.>>%ctrlcft% & set "chaine="

    goto :eof


    0
    1. Ka-El Messages postés 279 Statut Membre
       
      Magnifique ! :-)
      ça marche nickel ! Je savais que je pouvais compter sur toi.
      Juste quelques trucs à adapter, mais l'essentiel est là.
      Merci beaucoup pour ton aide précieuse !
      0