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 :

Regex - Recherche de : SELECT - FROM - multiligne ? [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut Regex - Recherche de : SELECT - FROM - multiligne ?
    Bonjour,

    J'ai plusieurs fichiers ou j'ai une multitude d'instruction SQL
    J'aimerais faire une recherche regex qui rechercherait tout ce qui commence par un SELECT et qui finirait par un point virgule ( en multiligne ou pas

    Je sais faire quand c'est sur une seule ligne, mais en multiligne je ne sais absolument pas comment faire, et pourtant j'ai fait plusieurs rechercher ... et ce que j'ai trouvé ne fonctionne pas (en fonction des adaptations que j'ai fait)

    Auriez vous des idées

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Un petit exemple de ce que tu as déjà fait aurait été préférable.

    Voici l'idée :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $result = Get-Content -Path "fichier.txt" -Raw | Select-String "(?si)select[^;]+;" -AllMatches | Foreach {$_.Matches} | Foreach {$_.Value}
    $result2 = (Get-Content -Path "fichier.txt" -Raw | Select-String "(?si)select[^;]+;" -AllMatches).Matches.Value

  3. #3
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Un petit exemple de ce que tu as déjà fait aurait été préférable.

    Voici l'idée :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $result = Get-Content -Path "fichier.txt" -Raw | Select-String "(?si)select[^;]+;" -AllMatches | Foreach {$_.Matches} | Foreach {$_.Value}
    $result2 = (Get-Content -Path "fichier.txt" -Raw | Select-String "(?si)select[^;]+;" -AllMatches).Matches.Value

    Merci beaucoup Ericlm128
    j'avais trouvé un code qui ressemble beaucoup sur le lien suivant
    https://stackoverflow.com/questions/...h-config-block
    mais je ne comprenais pas trop ce que [^!] voulait dire, il me semble avoir fait comme vous en remplaçant "!" par ";" mais pas le même résultat avec la ligne que vous avez donné (peut etre du (?smi) en (?si) qui fait que ça fonctionne maintenant), j'ai testé tellement de chose qui ne fonctionnait que partiellement que je ne voulais pas donner des mauvaise piste.

    Les deux lignes que vous avez donnés fonctionne très bien et je vous remerci beaucoup
    cependant dans des instructions SELECT j'ai de l'imbrication de SELECT et ça donne des résultats non attendu
    J'ai testé avec :
    "(?si)^select[^;]+;$"
    pour dire uniquement ce qui commence par un SELECT (avec le ^) et qui fini par un ; (avec le $) mais ça ne fonctionne pas

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Avec mon fichier de test cela fonctionne très bien.

    Il capture par exemple ceci
    select *
    from
    toto
    "SELECT";
    Le deuxième select est bien récupéré.

    C'est juste de l'analyse de texte, si tu souhaite faire un parseur SQL tu devrait avoir une approche différente.

    Le code fait ce qu'on (tu) lui demande. Il récupère ce qui commence par SELECT et qui fini par ;
    Il parcourt du début jusqu’à la fin du fichier.

    Si tu as une question plus précise..

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Si tu veux prendre du premier select jusqu'au dernier ;
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    $result3 = (Get-Content -Path "fichier.txt" -Raw | Select-String "(?si)select.*;" -AllMatches).Matches.Value

  6. #6
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    La dernière ligne que vous avez donné n'a pas fonctionné
    Dans le $result3 j'ai les lignes suivantes :

    CONNECT RESET;
    CONNECT TO xxxxxxx USER uuuuuuu USING pppppppp;
    Pour m'en sortir et avoir le résultat que je souhaite j'ai fait :

    Code PowerShell : 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
    $Fichiers = Get-ChildItem *.sql
     
     
    $detectSelect = $false
    $CollectSql = @()
    Foreach($item in $fichiers)
    {
        $ContentFile = Get-Content $item.FullName 
        foreach($line in $ContentFile)
        {
            If($line.ToLower().StartsWith("select") -eq $true)
            {    
                $detectSelect = $true
            }
            if($detectSelect -eq $true)
            {
                $sql += $line
                If($line.ToLower().EndsWith(";") -eq $true)
                {
                    $CollectSql += [pscustomobject]@{
                                                        Name = $item.BaseName
                                                        SQL = $sql
                                                    }
     
                    $detectSelect = $false
                    $sql = ""
                }
            }
     
        }

    ça n'a plus rien à voir avec la méthode regex mais j'obtiens le résultat voulu

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Tu n'avais pas préciser que :
    - le select devait être en débute de ligne
    - le ; en fin de ligne

    Si ça te convient c'est le principale, même si cela ne te fait pas progresser sur les Regexp.

  8. #8
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Bonjour,

    Je n'ai pas été très explicite dsl

    Mais nous pouvons peut être continuer le débat et trouvé une solution pour trouvé la bonne formule ? (ça m’intéresse grandement)

    Je disais :
    Citation Envoyé par troxsa Voir le message
    J'ai testé avec :
    "(?si)^select[^;]+;$"
    pour dire uniquement ce qui commence par un SELECT (avec le ^) et qui fini par un ; (avec le $) mais ça ne fonctionne pas
    Avez-vous une idée pourquoi ça ne fonctionne pas ?

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Le ^ et le $ sont des ancres qui signifient respectivement début de la chaîne de caractères et fin de la chaîne de caractères, et non pas début de ce que je recherche et fin de ce que je recherche. Donc cette pattern réussira uniquement si SELECT est au début de la chaîne et ; à la fin, sinon non.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Oui j'ai bien compris
    mes "Select" sont bien en debut de ligne

    Exemple de select que je peux avoir dans mon fichier :
    ________________________
    SELECT XXXXXX FROM
    XXXXXX;
    ________________________

    Je vais refaire un test avec "(?si)^select[^;]+;$"

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

Discussions similaires

  1. [COUNT] select ... from ... where count !
    Par tmcgrady dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2007, 17h29
  2. [Regex]Recherche de mots dans une chaîne
    Par lionel69 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 17/11/2005, 18h20
  3. Réponses: 5
    Dernier message: 31/10/2005, 13h25
  4. un SELECT FROM ????
    Par tarik75 dans le forum Langage SQL
    Réponses: 18
    Dernier message: 17/07/2005, 12h04
  5. Equivalent du Select * from ::Fn_Fonction()
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/07/2004, 09h48

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