[Batch] Recherche dans des fichiers XLM

Résolu/Fermé
Signaler
-
 Alpha13m -
Hello,

J'essaye de développer un petit programme en batch afin de parcours des fichiers et sous dossiers xml, et savoir si dans le code on trouve la valeur perso ="1"

je fais deux boucles, une qui lit mes fichiers, et une autre qui parcours le code de chaque fichiers.

-Le principe fonctionne si je mets un tokens=7 qui me retourne la 7e partie de la ligne ou je test si perso="1"

Ce que je voudrais en plus c'est de pouvoir retourner le numéro de ligne concernée, hors avec le tokens=7 il me mange des lignes puisque certaine peuvent contenir 12333 ou du vide et non des balises XML

Du coup il me faudrait un ]tokens=* c'est pourquoi j'utilise le set Array=!Array:~119,13! qui concatène ma chaîne et me retourne la valeur attendu F930PERSO="1".

-Le principe fonctionne mais s'il y plus de caractere en amont c'est foirée.

Auriez vous une solution pour faire la lecture de mes fichiers XML sans concatener ma chaine. Pour une recherche dans <F930FTTAB F930KY="F094REPORT" L930901MSG="F1T0LQJPR0P4KM8W003D2" F930GESTFT="2" F930NIV="9" F930NOMTABLE="F094REPORT" F930PERSO="1".... F901TI8ORI="">



:: Recherche dans un dossier parmis tous les fichiers xml present
:: Si l'on trouve le parametre perso=1
@echo off
setlocal enabledelayedexpansion

:: On definis les fichiers a scanner
:: Et la chaine a rechercher
:: Attention pas d'espace dans le chemin d'acces
set Path=Z:\Vega\Users\Clement\RechercheXMLPerso
set Files=*.xml
set FindWord=F930PERSO="1"
set Cpt=0
set Ligne=0

echo --------------------------------------------------
echo -- Recherche Repertoire --
echo --------------------------------------------------
echo Path !Path!
echo --------------------------------------------------
echo -- Recherche dans les XML --
echo --------------------------------------------------

REM Parcours de tous les fichiers et sous fichiers
for /r "%Path%" %%a in (%Files%) do (

set Array2=%%a

REM Parcours du code de chaque fichiers
for /f "tokens=* delims= " %%i in ('type !Array2!') do (

set Array=%%i

REM on concatenate la chaine pour ne garder que F930PERSO="1"
set Array=!Array:~119,13!
REM set Array=!Array:~119,13!
set /a Ligne += 1

REM echo Array !Array!

if !Array!==!FindWord! (
echo %FindWord% Trouver
echo %%a
set /a Cpt += 1

echo Ligne !Ligne!
echo --------------------------------------------------
)
)
set Ligne=0
)
if !Cpt!==0 (
echo Aucun fichier trouver
echo --------------------------------------------------
)

echo -- Fichier trouver %cpt% --
echo --------------------------------------------------
echo -- Fin --
echo --------------------------------------------------

pause






2 réponses

Messages postés
13758
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 janvier 2022
4 798
Salut,

Pour commencer tu confonds le terme "concaténer" avec le terme "découper".

Pour éviter le découpage de tes chaines de caractères tu peux utiliser une commande externe telle que FIND ou bien FINDSTR, cependant tu vas perdre beaucoup en performance et sur des fichiers de 50000 lignes tu vas le sentir passer.

Il n'y a pas de solution simple à ton problème, soit tu utilises une méthode rapide et peu pratique (découpage + IF), soit tu utilises une méthode pratique mais très lente (FIND ou bien FINDSTR)

0
Messages postés
10
Date d'inscription
lundi 8 mai 2017
Statut
Membre
Dernière intervention
7 mars 2019

Hey,

-Merci pour ta réponse, j'ai cette errreur la 'findstr' ou grep n’est pas reconnu en tant que commande interne.

Est ce qu'il faut installer des plugins additionnels?

-Ah l'heure actuelle ma variable qui compte ou ce trouve ma recherche ne prend pas les saut de ligne vide, y a t'il un moyen de gérer ça.?

-Comment tu ferai pour gérer le fait de ne pas savoir qu'elle longeur je vais avoir avant mon perso='1' pour faire mon test ?
0
Messages postés
13758
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 janvier 2022
4 798
j'ai cette errreur la 'findstr' ou grep n’est pas reconnu en tant que commande interne
==>> que vient faire GREP dans cette histoire ? FINDSTR est disponible sur toutes les versions depuis windows 2000

Est ce qu'il faut installer des plugins additionnels?
==>> non

-Ah l'heure actuelle ma variable qui compte ou ce trouve ma recherche ne prend pas les saut de ligne vide, y a t'il un moyen de gérer ça.?
==>> oui avec le commutateur /N de la commande FINDSTR

-Comment tu ferai pour gérer le fait de ne pas savoir qu'elle longeur je vais avoir avant mon perso='1' pour faire mon test ?
==>> j'utiliserais FINDSTR

Voilà un bon début de script :
@echo off
setlocal enableextensions disabledelayedexpansion
color 0A

cd /d Z:\Vega\Users\Clement\RechercheXMLPerso || exit /b 1

for %%A in (*.xml) do (
echo. & echo. & echo ###################### %%~fA
findstr /N "F930PERSO=""1""" "%%~A"
)

echo. & echo. & pause
0
Messages postés
10
Date d'inscription
lundi 8 mai 2017
Statut
Membre
Dernière intervention
7 mars 2019

Merci pour ta réponse je vais travailler la dessus !
0
Messages postés
10
Date d'inscription
lundi 8 mai 2017
Statut
Membre
Dernière intervention
7 mars 2019

Voici l'update, tout marche impeccable.

Le seul soucie qui va me rester c'est comment faire pour retourner le nombre de ligne trouvé. Dans mon document j'ai un parcours dans mon For ce qui fait que dans le errorlevel il y passe une fois et me tourne la valeur 1 ce qui est normal.
Hors dans un fichier je peux avoir plusieurs fois du perso=1 comment on pourrais gérer ce paramètre?

:: Recherche dans un dossier parmis tous les fichiers xml present
:: Si l'on trouve le parametre perso=1
@echo off & setlocal enableextensions EnableDelayedExpansion

:: On definis les fichiers a scanner
:: Et la chaine a rechercher
:: Attention pas d'espace dans le chemin d'acces
set PathFiles=Z:\Vega\Users\Clement\RechercheXMLPerso\XML_TEST

set Files=\*.xml
set result2=0
set cptFiles=0
set Ligne=0
echo --------------------------------------------------
echo -- Recherche Repertoire --
echo --------------------------------------------------
echo Path %PathFiles%
echo --------------------------------------------------
echo -- Recherche dans les XML --
echo --------------------------------------------------

for /r "%PathFiles%" %%a in (%Files%) do (

findstr /a:A /n /s "F930PERSO=""1""" "%%a"
Set /a cptFiles += 1

REM echo ERRORLEVEL !ERRORLEVEL!
if !ERRORLEVEL!==0 (
REM echo ERROR 0
Set /a Ligne += 1
)


)
if %Ligne% == 0 (
echo Pas de perso trouver
)
echo --------------------------------------------------
echo -- Total %Ligne% fichiers --
echo --------------------------------------------------
echo -- Fin --
echo --------------------------------------------------
pause
exit
0
Messages postés
13758
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 janvier 2022
4 798
Comme ceci :

@echo off
setlocal enableextensions enabledelayedexpansion
color 0A

cd /d Z:\Vega\Users\Clement\RechercheXMLPerso || exit /b 1

for %%A in (*.xml) do (

set count=-1
for /f "delims=" %%E in ('2^>nul find /N "F930PERSO=""1""" "%%~A"') do (
set /a count+=1
echo %%E
)
echo ---------- Total : !count! occurrences
echo.
)

pause
0
Messages postés
10
Date d'inscription
lundi 8 mai 2017
Statut
Membre
Dernière intervention
7 mars 2019

Super merci pour tout le temps que tu as pris pour traiter ça, tout est fonctionnel.

Je voudrais bien quelques explications sur le choix de :
cd /d Z:\Vega\Users\Clement\RechercheXMLPerso || exit /b 1 >
Plutot que d'avoir juste un for /r "%PathFiles%" %%A in (%Files%) do (

set count=-1 > et non pas 0
2^>nul > ??
%%~A plutot que %%A

Dernière petite chose et on en aura fini, est ce qu'il serait possible de colorer uniquement le numéro de la ligne trouvé en vert.
J'ai tester un findstr /a:A /n /s "F930PERSO=""1""" "%%~A mais dans la boucle for la couleur ne fonctionne pas

Bonne journée
0