IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Recherche dans un fichier txt [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut Recherche dans un fichier txt
    Bonjour,

    j'étudie des logs, et je recherche deux types de message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    11.06.14 06:00:19.287 U10 <jstore> {InputManagerThread} COMMON    --- ******************* Transaction : 1/
    
    11.06.14 06:00:19.397 U10 <jstore> {InputManagerThread} COMMON    --- *******************Erreur Communication

    Ce que je voudrais c'est :

    - si la chaine "Transaction :" apparait dans le fichier.log
    - alors, pour la derniere ligne contenant "Transaction :"
    - si une ligne contenant "Erreur Communication" apparait après
    - et si entre ces deux lignes, il n'y a pas d'autre ligne contenant la série d'étoile *******************
    - alors echo Transaction


    En francais :

    Je recherche dans mon log la ligne la plus récente contenant la chaine "Transaction :". Si la prochaine ligne contenant "*****" contient aussi "Erreur Communication", alors je fais un echo.


    Je n'arrive pas à faire un "delims=*" dans un FOR. Le FIND ***** ne recopie pas la suite de la ligne


    J'espère que je j'ai été assez clair.
    Un merci à ceux qui ont pris de temps de lire, un deuxieme merci à ceux qui prendront le temps de m'aider !

  2. #2
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Bonjour,

    Donne nous ton code ça nous fera une base pour t'aider.

  3. #3
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    Salut Drizzt, merci pour ta réponse, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    @echo off
    
    :: récupère dans le fichier transaction.txt, les lignes du terminal log indiqué dans le fichier nomTerminal.txt qui contiennent une tentative d'envoi de transaction 
    SET /p NomTerminal=<nomTerminal.txt
    FIND /n "Transaction : 1/" %NomTerminal% >Transaction.txt
    
    
    SET ErrorLvl=%ERRORLEVEL%
    
    
    :: si erreur de la recherche, alors transaction.txt = -1
    IF %ErrorLvl%==2 (
    	ECHO -1>Transaction.txt
    )
    
    
    :: si le fichier ne contient pas de transaction bloquée, alors  transaction.txt = 0
    IF %ErrorLvl%==1 (
    	ECHO ^0>Transaction.txt
    )
    
    
    
    :: si le fichier contient au moins une transaction, alors vérfie si elle est toujours bloquée et récupère le nombre de transaction
    SETLOCAL ENABLEDELAYEDEXPANSION
    IF %ErrorLvl%==0 (
    
    :: ici vérifier que la transaction est bien bloquée
    
    	FOR /F "tokens=2 delims=/" %%a IN (Transaction.txt) DO SET Transaction=%%a
    	ECHO !Transaction!>Transaction.txt
    )
    SETLOCAL DISABLEDELAYEDEXPANSION

    Mes logs sont assez complexes et le nombre de cas à prendre en compte m'a fait perdre la tête pour les autres parties de mon batch. Aussi la seule solution fiable que j'ai trouvé pour vérifier qu'il y a bien une transaction bloquée dans le fichier est celle que j'ai cité dans mon premier post :

    Dans le fichier, chercher la chaine "Transaction : 1/".
    Prendre l'occurence la plus récente de cette chaine (donc celle qui est écrite en dernier dans le log).
    Vérifier que la prochaine ligne contenant la série d'étoile ****** contient également le chaine "Error Communication".


    Je pense que le mieux serait de récupérer toute les lignes messages (celles qui contiennet la série d'étoile) dans un fichier texte et de le balayer avec un FOR.


    Merci

  4. #4
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Si j'ai bien compris voici ce que tu peux faire :

    1. Récupération des lignes avec *******. Pour cela findstr /N /C:"*****" nom_fic.log conviendra. Stocker le résultat dans un fichier

    2. Récupération des lignes avec Transaction dans ce résultat. Récupération de la dernière ligne et stockage du numéro de ligne et du numéro de transaction (boucle for avec delims=: sur un findstr /C:"Transaction" fic_etape_1)

    3.1 Récupération de la ligne suivant le numéro de ligne récupéré à l'étape précédente (findstr /B/C"num_ligne+1" sur le fichier de l'étape 1)
    3.2. Test si cette ligne contient "Erreur Comm" (findstr + errorlevel). Si oui le numéro de transaction a déjà été récupéré à l'étape 2. Sinon, le numéro de transaction est 0.

    Bon courage.
    A priori tu dois savoir tout faire vu le code que tu as fourni.

    C'est pas la solution la plus efficace et selon ta volumétrie ce n'est pas forcément adapté. Tu peux tout faire en un seul parcours du fichier de log en positionnant des flags. Mais je trouve la solution ci-dessus plus lisible.

    Mais bon si tu as une grosse volumétrie, le batch est pas non plus adapté

  5. #5
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    Salut, j'ai mis un peu de temps à répondre j'étais bien occupé ces derniers jours


    Le problème que j'ai avec ta solution, et je l'ai cité dans mon premier post, quand je fais un FIND "***" les lignes recopiés s'arrentent aux étoiles.

    FIND "***" sur "aaabbbccc*****erreur" renvoie "aaabbbccc*****" !


    demain je vais essayer avec un FOR et des delims et tokens

  6. #6
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Avec la ligne que je t'ai indiquée comme étape 1 tu récupèrera bien toute ta ligne.
    Et avec find aussi, le problème que tu indiques dans ton premier post viens plus probablement de ton FOR que du find.


    La solution que je te présente fonctionne. Il faut juste que tu fasses l'effort de la mettre en oeuvre. Si tu ne comprends pas une étape ou l'enchainement, n'hésite pas à demander.

    Si tu prefères rester sur ce que tu as commencé à faire, pas de souci mais ne dis pas que ce que l'on propose est faux sans l'avoir testé

  7. #7
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Citation Envoyé par Drizzt [Drone38] Voir le message
    Si tu prefères rester sur ce que tu as commencé à faire, pas de souci mais ne dis pas que ce que l'on propose est faux sans l'avoir testé
    Je plussoies.

    Je pense par ailleurs qu'il est possible aussi de se passer de l'étape de stockage sur fichier.

  8. #8
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    Je ne suis pas venu poster pour vous prendre pour des imbéciles, alors svp faites de meme ! J'ai bien testé ce que tu m'as envoyé Drizzt et ca ne marche pas chez moi, la preuve en image...


    Je n'ai pas compris l'histoire des flags, j'ai beau chercher sur le net je ne vois pas de quoi tu parles, si tu pouvais m'indiquer comment faire ou où chercher ?

    En attendant, de retour au bureau je teste avec mes délimiteurs..



    Edit: je viens de comprendre pourquoi ca ne marche pas chez moi, il y a un "caractère caché" juste après la série d'étoile qui semblerait etre un retour à la ligne. Il n'est pas pris en compte quand j'ouvre le fichier sous bloc notes, avec notepad le message est bien affiché sur plusieurs lignes... haha
    Images attachées Images attachées   

  9. #9
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    Pour ceux que ca intéresse, j'ai trouvé une solution à mon problème.

    La nature du problème à un peu changé depuis le premier post.

    J'ai donc un log (fichier texte) qui ressemble à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    texte....
    texte....
    texte....
    texte ********
    message 1
    message 2
    message x
    ......
    texte ********
    texte....
    texte....

    Je cherche à étudier les lignes de type message 1.
    Pour la dernière occurrence d'une telle ligne commençant par "Transaction : 1/", si la prochaine ligne de type message 1 commence par "Erreur" alors echo la ligne "Transaction : 1/...".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    set /a nLigne=0
    set /a Ecrire=0
    set /a dejaEcrit=0
    set /a transactionTrouvee=0
    
    setlocal enabledelayedexpansion
    for /f "tokens=*" %%a in ('type terminal.log') do (
    	
    	set ligne=%%a
    	set siEtoile=!ligne:*******************=!
    	set siTransaction=!ligne:Transaction : 1/=!
    	set siErreur=!ligne:Erreur=!
    
    	
    	if not "%%a"=="" if not !ligne!==!siEtoile! if !Ecrire!==0 if !dejaEcrit!==0 (set /a Ecrire=1)
    	
    	if not "%%a"=="" if !ligne!==!siEtoile! if !Ecrire!==1 (
    		
    		if !transactionTrouvee!==1 if not !ligne!==!siErreur! (set /a transactionTrouvee=2) else (set /a transactionTrouvee=0)
    				
    		if not !ligne!==!siTransaction! (
    			set nbTransaction=!siTransaction!
    			set /a transactionTrouvee=1 
    		)
    		
    		set /a dejaEcrit=1
    		set /a Ecrire=0
    	)
    
    	if not "%%a"=="" if not !ligne!==!siEtoile! if !dejaEcrit!==1 (set /a dejaEcrit=0)
    
    	
    )
    setlocal disabledelayedexpansion
    
    if %transactionTrouvee%==2 (echo %nbTransaction% >>HOHO.txt) else (echo 0 >>HOHO.txt)

    @Drizzt : tu n'as pas répondu à ma question sur les flags, mon post d'hier ne t'aurais pas plu ?

  10. #10
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Les flags c'est ce que tu as utilisé.
    Tes variables Ecrire, dejaEcrit, transactionTrouvee ... sont des flags.


    C'est mieux en terme de perfs que la solution que je décrivait car tu ne fait qu'une seule lecture du fichier. Mais comme je l'indiquais c'est pas le plus lisible et facile à maintenir pour quelqu'un qui passe derrière.

  11. #11
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    Ah bah ok!

    C'est sûr que d'autres vont passer derrière étant donné que je m'en vais dans une semaine, et c'est sûr qu'ils vont galérer étant donné que même moi après la pause midi j'ai eu du mal

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Par défaut
    Bonjour,

    je souhaiterai faire un truc similaire mais je n'y arrive pas.

    Ma problématique est simple : je dois générer des fichiers vides avec une extension PDF pour émuler une bibliothèque de fichiers.
    Le nom des fichiers est stocké dans un fichier csv.

    Voici le bout de code que j'ai tenté d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @echo off & setlocal ENABLEEXTENSIONS
    set sortie=./Out
    for /f "delims=" %%a in ('more ^< ref.csv') do (
        set line=%%a
        echo test>%sortie%/%line%
    )
    Et cela ne fonctionne pas :p

    Par contre si je dégage le echo de ma boucle for pour la mettre après, j'arrive bien à générer un fichier (le dernier de la liste forcément).

    Une idée ? merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recherche dans deux fichiers txt
    Par silvermanu dans le forum VBScript
    Réponses: 4
    Dernier message: 29/04/2010, 07h57
  2. Ajouter , rechercher dans un fichier txt
    Par Eausport dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/06/2009, 23h31
  3. Réponses: 5
    Dernier message: 01/03/2009, 22h32
  4. Recherche dans un fichier txt
    Par GOMMME dans le forum Langage
    Réponses: 16
    Dernier message: 24/04/2008, 17h15
  5. Recherche dans un fichier .txt et remplacer
    Par FracMaster dans le forum Langage
    Réponses: 12
    Dernier message: 09/05/2007, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo