Problème pour extraire des informations d'un fichier

Résolu/Fermé
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 - 2 oct. 2019 à 09:43
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 - 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 ! :-)
A voir également:

2 réponses

barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 906
Modifié le 2 oct. 2019 à 21:54
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
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
3 oct. 2019 à 08:35
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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 906 > Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
Modifié le 4 oct. 2019 à 00:52
@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
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
4 oct. 2019 à 10:52
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
Il me faudrait un bout du fichier pour pouvoir tester en condition réelle.
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
7 oct. 2019 à 07:59
Salut Barnabe,
Fichier dispo en mp
Merci pour ton aide ! :-)
0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 906
Modifié le 7 oct. 2019 à 23:59
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
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
8 oct. 2019 à 14:04
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