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

Signaler
Messages postés
258
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
3 juillet 2020
-
Messages postés
258
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
3 juillet 2020
-
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

Messages postés
12669
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 août 2020
3 426
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.”
Messages postés
258
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
3 juillet 2020

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 ! :-)
Messages postés
12669
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 août 2020
3 426 >
Messages postés
258
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
3 juillet 2020

@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
Messages postés
258
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
3 juillet 2020

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.
Messages postés
258
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
3 juillet 2020

Salut Barnabe,
Fichier dispo en mp
Merci pour ton aide ! :-)
Messages postés
12669
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 août 2020
3 426
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.”
Messages postés
258
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
3 juillet 2020

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 !