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

Linux Discussion :

simuli-parser de fichier


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut simuli-parser de fichier
    Bonjour,

    pour ceux qui connaissent ce langage, j'ai des fichiers .SAS que je souhaiterai "décortiquer" un peu...

    Le fait qu'ils soient ecris en SAS importe peu, voire pas du tout, ça s'ouvre tres bien comme un fichier .txt


    Grosso modo, je voudrais récupérer les requetes SQL qui se trouvent dans le tas de code.

    J'ai pu remarquer que ces requetes prenaient cet aspet:

    connect to oracle ( -----------)
    create table ----------- as select -------- from connection to oracle
    (
    select ...
    from ...
    where ...
    ) ;
    en gras, ce sont les 'balises' que j'ai relevées qui entoure les requetes.

    En soit meme, ça me parait bete comme tout, mais le hic, c'est que je suis pas du tout a l'aise avec les scripts bash / awk / sed ...

    Je peux avoir plusieurs bout de code comme ça dans un fichier, et les indentations, espaces, retour à la ligne, ... ne sont pas toujours respectés ni les memes du coup...

    je peux avoir du:
    -> from connection to oracle (
    -> from connection to oracle(
    -> from connection to oracle
    (select
    -> ...

    de meme, au niveau de la balise de fin, je ne peux pas m'appuyer sur le ';' car je peux avoir du code dans les requetes, ce qui me place des ';' au milieu.
    et je peux avoir du texte entre le ')' et le ';' dans ce style là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ) {[A-Za-z]|' '|' (retour à la ligne) ' }*
    Et lorsque c'est un code imbriqué dans la requete, le texte sera toujours %end mais avec des espaces et retours à la ligne possible...


    Quelqu'un pourrait m'aider là dessus? (avec des explications sur les commandes du sed/awk/... parce que les \/^ et tout, je comprend pas du tout :/ )

  2. #2
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par _Moa_
    Bonjour,


    Grosso modo, je voudrais récupérer les requetes SQL qui se trouvent dans le tas de code.
    .../...


    Un début de solution avec "awk" :

    Script :
    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
     
    awk '
    {
    	if (TopRequete == 0) {
    		if ($0 ~ /from connection to oracle/) {
    			TopRequete=1			
    		}
    		next
    	}
    	if (TopRequete == 1) {
    		print $0		#-- Ecr. partie de requete
    		if ($0 ~ /\)/) {	#-- Detection de parenthese fermante
    			TopRequete=0
    		}
    	}
    } ' toto.txt

    Fichier traité, toto.txt :
    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
     
    connect to oracle ( -----------)
    create table ----------- as select -------- from connection to oracle (
    select ...
    from ...
    where ...
    ) ; 
    x
    x
    connect to oracle ( -----------)
    create table ----------- as select -------- from connection to oracle(
    select ...
    from ...
    where ...
     ) blabla
    ; 
    a
    e
    connect to oracle ( -----------)
    create table ----------- as select -------- from connection to oracle
    ( select ...
    from ...
    where ...
    ) blabla ; 
    blabla2

    Exécution du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ xawk.sh
    select ...
    from ...
    where ...
    ) ;
    select ...
    from ...
    where ...
     ) blabla
    ( select ...
    from ...
    where ...
    ) blabla ;

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci.


    Par contre, je peux avoir des parentheses à l'interrieur de ce que je veux garder...

    du coup, se baser sur la parenthese fermante, ça marche pas :/


    je sais que ça termine par
    )[blabla];


    mais ce 'blabla' ne doit pas etre %end

    j'avais pensé à un /\().\([^%]end\).;\)/
    Mais la syntaxe, je pige pas tout :s
    ...

  4. #4
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par _Moa_
    Merci.


    Par contre, je peux avoir des parentheses à l'interrieur de ce que je veux garder...

    .../...

    Un peu mieux :

    Fichier entree :
    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
    connect to oracle ( -----------)
    create table ----------- as select -------- from connection to oracle (
    select ... (1)
    from ...
    where ...   blabla ( ... )
    ) ; 
    x
    x
    connect to oracle ( -----------)
    create table ----------- as select -------- from connection to oracle(
    select ... (2)
    from ...
    where ...
     ) blabla
    ; 
    a
    e
    connect to oracle ( -----------)
    create table ----------- as select -------- from connection to oracle
    ( select ... (3)
    from ...
    where ...   blabla ( ... )
     ... ( ... )
    ) blabla ; 
    blabla2
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    select ... (1)
    from ...
    where ...   blabla ( ... )
    ) ;
    select ... (2)
    from ...
    where ...
     ) blabla
    ( select ... (3)
    from ...
    where ...   blabla ( ... )
     ... ( ... )
    ) blabla ;

    Script :

    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
     
    awk '
    {
    	if (TopRequete == 0) {
    		if ($0 ~ /from connection to oracle *\( *$/) {
    			TotParenthOuvr++
    			TopRequete=1
    			next
    		}
    		if ($0 ~ /from connection to oracle/) {
    			TopRequete=1
    			next
    		}
    	}
    	if (TopRequete == 1) {
    		print $0		#-- Ecr. partie de requete
    		NbParenthOuvr=split($0,Buffer,/\(/) 
    		TotParenthOuvr=TotParenthOuvr+NbParenthOuvr
    		NbParenthFerm=split($0,Buffer,/\)/) 
    		TotParenthFerm=TotParenthFerm+NbParenthFerm
    		if (TotParenthOuvr == TotParenthFerm) {
    			TopRequete=0
    			TotParenthOuvr=0
    			TotParenthFerm=0
    		}
     
    	}
    } ' toto.txt

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci!

    En fait, j'avais pas pensé à compter le nombre de parenthese, et maitnenant, ça me parait tout con!

    C'est bien plus simple que de chercher vis à vis de pseudos mots clefs, qui sont super variables avec les retours à la ligne et tout...

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Erf, je suis tombé sur un joli probleme


    awk: Input line cannot be longer than 3,000 bytes.
    The input line number is 527. The file is emi9001g.sas.
    The source line number is 1.

  7. #7
    Membre régulier Avatar de bustaja
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2007
    Messages : 109
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par _Moa_
    j'avais pensé à un /\().\([^%]end\).;\)/
    Moi j'aurais plutot pensé à un {#~`\^@& mais j'suis pas sur...

    En tous cas, bon courage et pouek!

Discussions similaires

  1. [SAX] parser un fichier xml en Java
    Par royou dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/02/2005, 17h12
  2. parser un fichier .dtd
    Par bgranou dans le forum Valider
    Réponses: 2
    Dernier message: 04/06/2004, 19h53
  3. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08
  4. parser un fichier avec xerces
    Par traiangueul dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 02/02/2004, 18h14
  5. parser un fichier html
    Par noarno dans le forum ASP
    Réponses: 2
    Dernier message: 10/12/2003, 17h53

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