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 ?


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    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é
    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 habitué
    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é
    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é
    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 habitué
    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é
    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 habitué
    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 confirmé
    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 habitué
    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[^;]+;$"

###raw>template_hook.ano_emploi###