[Batch] Recherche dans des fichiers XLM

A voir également:[batch] recherche dans des fichiers xlm[Batch] Recherche dans les noms de fichiers. ✓ - Forum - Autoit / batch Probleme creation batch recherche fichiers ✓ - Forum - Autoit / batch BATCH recherche lignes commençant par depuis un fichier txt ✓ - Forum - Autoit / batch Batch ecrire dans un fichier - Conseils pratiques - MS-Dos Faire une recherche dans un fichier excel ✓ - Forum - Excel

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






Forum

A voir également:[batch] recherche dans des fichiers xlm[Batch] Recherche dans les noms de fichiers. ✓ - Forum - Autoit / batch Probleme creation batch recherche fichiers ✓ - Forum - Autoit / batch BATCH recherche lignes commençant par depuis un fichier txt ✓ - Forum - Autoit / batch Batch ecrire dans un fichier - Conseils pratiques - MS-Dos Faire une recherche dans un fichier excel ✓ - Forum - Excel

Web: www.shapebootstrap.net

2 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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)

Reply

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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 ?

Reply
réponses:
  • auteur

  • auteur

    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

  • auteur

    Merci pour ta réponse je vais travailler la dessus !

  • auteur

    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

  • auteur

    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

  • auteur

    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

  • auteur

    Dans cet esprit la

  • auteur

    Je vais essayer d'expliquer :

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

    ==>> cette ligne est d'une importance capitale pour moi et fait partie de tous mes scripts, elle a une double utilité : d'un côté elle facilite l'écriture et la lecture du script puisqu'en travaillant directement dans le dossier concerné ça évite de devoir remettre à chaque fois le chemin complet pour chaque commande, d'un autre côté c'est une sécurité qui teste l'existence du dossier et en cas de faute d'orthographe ou de dossier inexistant ça empêche le script de faire n'importe quoi n'importe où en faisant quitter très simplement le script (EXIT)



    set count=-1 > et non pas 0

    ==>> quand tu utilises FIND /N tu remarqueras que la commande affiche non seulement les lignes trouvées, mais également une première ligne contenant le nom du fichier. Cette première ligne provoque un décalage dans le calcul du nombre de lignes



    2^>nul > ??

    ==>> c'est une redirection de l'erreur standard (STDERR), des fois certaines commandes renvoient des messages d'erreur qui peuvent être interprétés (par exemple le script confond un message d'erreur avec un nom de fichier) dans la suite du script, dans ce cas précis je n'ai pas testé si elle était vraiment utile, cependant je préfère la laisser ça ne coûte rien.



    %%~A plutot que %%A

    ==>> c'est une bonne habitude à prendre, si ta variable est entourée de doubles quotes " " il vaut mieux l'expanser pour éviter de se retrouver avec 2 paires de doubles quotes
    Exemple : si %%A vaut "toto" alors %%~A vaut toto



    Concernant les couleurs ce n'est pas faisable de manière simple, il faut passer par une commande externe, je n'ai même pas de nom à te donner, il faut fouiller sur le net.

  • auteur

    Merci pour toutes ces infos, le sujet est résolu.

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed