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

Langage Perl Discussion :

Aide sur les regexp


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut Aide sur les regexp
    Bonjour,

    Je débute en perl et j'ai du mal avec les regexp...

    Voila j'ai un fichier texte tkprof et je voudrais, à partir de celui-ci, créer un autre fichier contenant que les données qui me seront utiles pour les passer dans un excel par exemple.

    Voici le début du fichier texte tkprof que je peux avoir en entrée :


    TKPROF: Release 9.2.0.1.0 - Production on Ve Mar 21 11:02:43 2008

    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

    Trace file: /save/udump/trace_helios3/ora03656.trc
    Sort options: default

    ********************************************************************************
    count = number of times OCI procedure was executed
    cpu = cpu time in seconds executing
    elapsed = elapsed time in seconds executing
    disk = number of physical reads of buffers from disk
    query = number of buffers gotten for consistent read
    current = number of buffers gotten in current mode (usually for update)
    rows = number of rows processed by the fetch or execute call
    ********************************************************************************

    alter session set nls_date_format = 'DD-MM-YYYY HH24:MI:SS'


    call count cpu elapsed disk query current rows
    ------- ------ -------- ---------- ---------- ---------- ---------- ----------
    Parse 3 0.02 0.01 0 0 0 0
    Execute 3 0.00 0.00 0 0 0 0
    Fetch 0 0.00 0.00 0 0 0 0
    ------- ------ -------- ---------- ---------- ---------- ---------- ----------
    total 6 0.02 0.01 0 0 0 0

    Misses in library cache during parse: 0
    Optimizer goal: CHOOSE
    Parsing user id: 57
    ********************************************************************************

    SELECT
    BO_MACRO_RAPPORT.NOM_RAPPORT
    FROM
    BO_MACRO_RAPPORT
    WHERE
    (
    BO_MACRO_RAPPORT.NOM_RAPPORT_PILOTE = 'PILOTE_EN_COURS_CLIENT'
    )

    call count cpu elapsed disk query current rows
    ------- ------ -------- ---------- ---------- ---------- ---------- ----------
    Parse 4 0.14 0.15 0 0 0 0
    Execute 2 0.00 0.00 0 0 0 0
    Fetch 4 0.00 0.00 0 4 8 2
    ------- ------ -------- ---------- ---------- ---------- ---------- ----------
    total 10 0.14 0.15 0 4 8 2

    Misses in library cache during parse: 0
    Optimizer goal: CHOOSE
    Parsing user id: 57
    ********************************************************************************


    Dans ce fichier apparait toutes les requêtes passées avec des stats. Le but serait de récupérer chaque requête (SELECT, INSERT, DELETE, ALTER, etc) et les stats concernant la colonne "elapsed" pour chacune d'entre elle.
    J'y suis arrivé avec un script ksh mais je pense que perl est plus adapté pour cela mais j'ai beaucoup de mal...

    On devrait obtenir ceci en sortie :

    SELECT * FROM SYS.SESSION_ROLES WHERE ROLE = 'DBA'
    ~0.27~0.00~0.00~0.27
    SELECT pc_user_def.password , pc_user_def.user_skey , pc_user_def.profile_skey , pc_user_def.first_name , pc_user_def.mi , pc_user_def.last_name , pc_user_def.active_ind FROM pc_user_def WHERE pc_user_def.user_id =:1
    ~0.47~0.00~0.00~0.47
    BEGIN HELIOS.SESSION_COMMENCER2( :0,:1,:2); END;
    ~0.03~0.73~0.00~0.76
    SELECT TLS.LOGIN_UTILISATEUR || ' / ' || VSS.TERMINAL FROM V_OSUSER2 VSS,SESSION_UTILISATEUR SSU,UTILISATEUR TLS WHERE SSU.SESSION_ID (+) = VSS.SID AND TLS.UTILISATEUR_ID (+) = SSU.UTILISATEUR_ID
    ~0.45~0.09~3.38~3.92

  2. #2
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut
    J'essayes de commencer par récupérer les différentes requetes pour les placer dans le fichier resultat.txt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my $requetes = qw( select alter insert delete update begin overall );
     
    open (F,"$rep/ora03380.txt");
     
    open (Fsor,">$rep/resultat.txt");
     
    while (<F>){
    if ( /^$requetes/gi) {
            print Fsor $1;
        }
    }
    Mon fichier resultat.txt reste vide. De plus je ne penses pas pouvoir récupérer chaque requête entierement comme cela...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut
    Bonjour,

    Voici un script qui devrait t'aider à démarrer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    use strict;use warnings;
     
    local $/="\n\*\*\*\*\*\*\*\*";
     
    <>;<>; #saute les 2 premiers records qui ne sont pas intéressants
    while(<>){
       my ($query)= m/\n\s*\n(.*?)\n\s*\n/s;
       if ($query){
          print "=" x 70,"\n$query","\n";
          while (m/^(Parse|Execute|Fetch)\s+\S+\s+\S+\s+(\S+)/mg){
             print "$1(elapsed) => $2\n";
          }
       }
    }
    Ton premier problème est de lire le fichier par unité logique (une query avec ses infos). 'Le séparateur semble être une ligne de '*'. On fixe donc ici le séparateur de record en entrée à une suite de '*' en début de ligne.

    Ensuite, pour chaque record, on extrait les infos. La query est la première zone de texte qui est précédée d'une ligne blanche et suivie d'une ligne blanche. Etc.

    Ceci est un example ad-hoc et résistera assez mal à une modification du fichier de log. A toi de te demander quels sont les réels patterns sur lesquels se reposer. peut-on rencontrer d'autres lignes de '*', la colonne elapse risque elle de changer de place (il faudrait alors parser la ligne de titre pour la retrouver). Etc.
    La robustesse est une question récurrente avec les expressions régulières. Tu peux y répondre en connaissant parfaitement le format du fichier. Une stratégie que je recommande est de vérifier en plus que les données extraites sont cohérentes. par exemple que la query commence bien par un mot clé attendu, que elapse est bien un chiffre...

    Bon courage!

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut
    Salut!

    Tu peux aller voir ici aussi :
    http://www.developpez.net/forums/sho...d.php?t=506831

    C'est un topique où on à parlé de comment récupérer des informations sur un .log,
    Regarde tu verra c'est assez similaire à ton problème.

    J'espère t'aider un peu.
    A plus tard!

  5. #5
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut
    PerlPicker : Que représente exactement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    local $/="\n\*\*\*\*\*\*\*\*";
    C'est une sorte de variable qui contient le séparateur ******* ?
    Je ne connais pas cette forme : local $/

    kimous : merci je pense pouvoir m'inspirer de certaines choses en effet!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut
    En fait j'ai 'escapé' les * mais ce n'est pas nécessaire car ce n'est pas une expression régulière. Le code devrait donc être:

    $/ est une variable qui contient la chaine utilisée par Perl pour définir la séparation des lignes en lecture d'un fichier. c'est "\n" par défaut et il lit donc ligne par ligne.
    Ici on dit simplement de lire d'un coup tous les charactères jusquà trouver 8 * en début de ligne.
    local permet de limiter la modification de $/ au bloc (ici le script). C'est une bonne habitude qui évite des erreurs dans d'autres parties du code qui utiliseraient aussi $/ (modules, functions ...). C'est grosso modo comme my qui est interdit sur les variables globales.

Discussions similaires

  1. Demande d'aide sur les regexp
    Par Uld dans le forum Langage
    Réponses: 1
    Dernier message: 18/08/2006, 22h15
  2. Aide sur les groupes (ADO)
    Par portu dans le forum QuickReport
    Réponses: 3
    Dernier message: 18/08/2004, 16h13
  3. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 10h16
  4. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 16h28
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

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