Problème pour extraire des informations d'un fichier [Résolu]

Messages postés
221
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
8 octobre 2019
- - Dernière réponse : Ka-El
Messages postés
221
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
8 octobre 2019
- 8 oct. 2019 à 14:04
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 ! :-)
Afficher la suite 

2 réponses

Messages postés
12376
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
14 octobre 2019
2292
0
Merci
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.


“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
Ka-El
Messages postés
221
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
8 octobre 2019
-
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 ! :-)
barnabe0057
Messages postés
12376
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
14 octobre 2019
2292 > Ka-El
Messages postés
221
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
8 octobre 2019
-
@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
Ka-El
Messages postés
221
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
8 octobre 2019
-
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é...
Il me faudrait un bout du fichier pour pouvoir tester en condition réelle.
Ka-El
Messages postés
221
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
8 octobre 2019
-
Salut Barnabe,
Fichier dispo en mp
Merci pour ton aide ! :-)
Commenter la réponse de barnabe0057
Messages postés
12376
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
14 octobre 2019
2292
0
Merci
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



“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
Ka-El
Messages postés
221
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
8 octobre 2019
-
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 !
Commenter la réponse de barnabe0057