[Batch] Recherche dans des fichiers XLM

Résolu/Fermé
Alpha13m - Modifié le 11 févr. 2019 à 16:07
 Alpha13m - 18 févr. 2019 à 11:48
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






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 908
11 févr. 2019 à 21:04
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
Alpha13m Messages postés 10 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 7 mars 2019
Modifié le 12 févr. 2019 à 08:49
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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 12 févr. 2019 à 20:21
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
Alpha13m Messages postés 10 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 7 mars 2019
13 févr. 2019 à 08:48
Merci pour ta réponse je vais travailler la dessus !
0
Alpha13m Messages postés 10 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 7 mars 2019
13 févr. 2019 à 13:28
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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 13 févr. 2019 à 19:27
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
Alpha13m Messages postés 10 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 7 mars 2019
Modifié le 14 févr. 2019 à 10:43
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