Article complet: Fonction de découpage à césure multiple

20/04/2009

[SGBD][SQL Server] 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...

[Suite:]

Cette fonction permet de découper une phrase selon de multiples caractère de césure.

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 <=  LEN(@PHRASE)  
BEGIN  
-- on lit le premier caractère de la phrase 
   SET @C = SUBSTRING(@PHRASE, @I, 1); 
-- on regarde si c'est un caractère de césure 
   SET @IC = CHARINDEX(@C, @PARSEC); 
   -- si c'est un caractère de césure... 
   IF @IC > 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 

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

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0

Cet article n'a pas de Commentaires/Pingbacks pour le moment...

Vous devez être identifié pour poster un commentaire.

Liste des blogs

< Le blog de SQLpro/>

Fred Brouard alias SQLpro

Rechercher

<  Novembre 2011  >
Lun Mar Mer Jeu Ven Sam Dim
  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        

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web