Fonction de découpage à césure multiple

Voici un problème complexe, comment « parser » une phrase avec, non pas un caractères de césure, mais un ensemble ? Cette fonction répond à cette demande en fournissant en sortie une table…

Cette fonction permet de découper une phrase selon de multiples caractère de césure. On parle aussi de split ou splittage.

En entrée :

@PHRASE : la phrase à découper
@PARSEC : les caractères de césure

En sortie, une table comprenant :

colonne 1 : POS la position du mot dans la phrase
colonne 2 : MOT le mot
colonne 3 : CHR le caractère de césure
CREATE FUNCTION dbo.F_MULTIPARSE(@PHRASE VARCHAR(MAX),
                                 @PARSEC VARCHAR(256))
RETURNS @T TABLE (POS   INT,
                  MOT   VARCHAR(128),
                  CHR   CHAR(1))
AS
/******************************************************************************  
* Fonction table de découpage à césure multiple                               *
*******************************************************************************  
* Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-04-17 *  
******************************************************************************/

BEGIN  
-- effets de bord  
IF @PHRASE IS NULL RETURN;  
IF COALESCE(@PARSEC, '') = ''  
BEGIN  
   INSERT INTO @T VALUES (1, @PHRASE, NULL);  
   RETURN;  
END;  
-- variables locales  
DECLARE @C    CHAR(1),      -- lettre analysée  
        @MOT  VARCHAR(128), -- mot découpé  
        @I    INT,          -- boucle sur phrase  
        @J    INT,          -- boucle sur caractère de césure    
        @JMIN INT,          -- premier caractère de césure dans phrase  
        @IC   INT,            
        @M    INT;  
SELECT @I = 1, @M = 1, @MOT = '';  
-- boucle sur phrase  
WHILE @I  0  
   BEGIN  
      -- si le mot n'est pas vide
      IF @MOT  ''
      BEGIN
         -- on insère le mot  
         INSERT INTO @T VALUES (@M, LTRIM(@MOT), @C);
         -- on incrémente le compteur de mot et on réinitialise le mot
         SELECT @M = @M + 1, @MOT = '';
      END;
   END;
   ELSE
      SET @MOT = @MOT + @C;
   SET @I = @I + 1;  
END;
-- insertion du dernier mot  
IF @MOT  ''  
   INSERT INTO @T VALUES (@M, @MOT, NULL);  
RETURN  
END  
GO

EXEMPLE :

SELECT *
FROM   dbo.F_MULTIPARSE('toto, tata-titi', '-,')
POS         MOT                  CHR
----------- -------------------- ----  
1           toto                 ,    
2           tata                 -    
3           titi                 NULL

COMPTE TENU DE L’INCAPACITÉ CRASSE DE L’ÉQUIPE DE DEVELOPPEZ.COM DE FOURNIR DES OUTILS CORRECTS DE PUBLICATION NOTAMMENT DU CODE, LA FONCTION A ÉTÉ MISE EN FICHIER TEXTE AFIN QUE LE CODE NE SOIT PAS « MANGÉ » PAR LA MISE EN PAGE DÉBILE DES BALISES MAL ÉCRITES…
RETROUVEZ LE CODE COMPLET ET CORRECT DE CETTE FONCTION ICI (F_MULTIPARSE)

NOTA : si vous voulez découper avec le caractère espace (blanc) il ne faut pas le placer en fin du paramètre @PARSEC sinon il sera ignoré du fait du type VARCHAR. Si vous ne voulez parser que sur le blanc, rajouter à la suite du blanc un caractère non imprimable (ASCII inférieur à 20). Par exemple CHAR(8)


--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence  * * * * *

MVP Microsoft SQL Server

Laisser un commentaire