braderic
Messages postés7Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention 5 mai 2008
-
5 mai 2008 à 14:35
eto95
Messages postés2Date d'inscriptionmercredi 3 mars 2004StatutMembreDernière intervention25 juillet 2008
-
25 juil. 2008 à 18:10
Bonjour,
Je developpe un programme sur le principe d'une base de données de document au format RTF mais lors de recherche SQL genre 'select * from matable like %bol%" les balises RTF sont vues par la requete et desdocuments ne comprenant pas dans le texte les lettres "bol" ressortent car ils ont une balise 'bold' .
J'ai pensé a creer une table avec 2 champs : un avec uniquement le texte et l'autre avec le RTF mais je trouve ça lourd .....
eto95
Messages postés2Date d'inscriptionmercredi 3 mars 2004StatutMembreDernière intervention25 juillet 2008 25 juil. 2008 à 18:10
Salut,
voici deux fonctions qui te permet de reccuperrer le text d'un RTF epuré de toutes balises.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[Hexa2Int]
(
@hexstr AS varchar(1000)
)
-- Function converts VARCHAR representation of HEX to INT
-- 'FF' --> 255
RETURNS INT
AS
BEGIN
IF @hexstr IS NULL RETURN NULL
DECLARE
@curbyte AS int,
@varbin AS varbinary(500)
IF @hexstr LIKE '0x%' SET @hexstr = SUBSTRING(@hexstr, 3, 8000)
SET @hexstr =
CASE LEN(@hexstr) % 2 WHEN 1 THEN '0' ELSE '' END + @hexstr
SET @varbin = 0x
SET @curbyte = LEN(@hexstr) / 2
WHILE @curbyte > 0
BEGIN
SET @varbin =
CAST(
CASE SUBSTRING(@hexstr, @curbyte * 2, 1)
WHEN '0' THEN 0x00
WHEN '1' THEN 0x01
WHEN '2' THEN 0x02
WHEN '3' THEN 0x03
WHEN '4' THEN 0x04
WHEN '5' THEN 0x05
WHEN '6' THEN 0x06
WHEN '7' THEN 0x07
WHEN '8' THEN 0x08
WHEN '9' THEN 0x09
WHEN 'A' THEN 0x0A
WHEN 'B' THEN 0x0B
WHEN 'C' THEN 0x0C
WHEN 'D' THEN 0x0D
WHEN 'E' THEN 0x0E
WHEN 'F' THEN 0x0F
END |
CAST(
CASE SUBSTRING(@hexstr, @curbyte * 2 - 1, 1)
WHEN '0' THEN 0x00
WHEN '1' THEN 0x10
WHEN '2' THEN 0x20
WHEN '3' THEN 0x30
WHEN '4' THEN 0x40
WHEN '5' THEN 0x50
WHEN '6' THEN 0x60
WHEN '7' THEN 0x70
WHEN '8' THEN 0x80
WHEN '9' THEN 0x90
WHEN 'A' THEN 0xA0
WHEN 'B' THEN 0xB0
WHEN 'C' THEN 0xC0
WHEN 'D' THEN 0xD0
WHEN 'E' THEN 0xE0
WHEN 'F' THEN 0xF0
END AS tinyint) AS binary(1))
+ @varbin
SET @curbyte = @curbyte - 1
END
RETURN CAST(@varbin AS INT)
END
Go
CREATE FUNCTION [dbo].[RTFtoText] (@RTF VARCHAR(5000))
RETURNS varchar(5000)
AS
BEGIN
Declare @ReplaceLineFeedWithSpace TinyInt, @DoTrimLeft TinyInt, @TrailAfter int
Select @ReplaceLineFeedWithSpace 0, @DoTrimLeft 0, @TrailAfter = 0
Declare @Result varchar(5000)
--n: Nombre de caractères à traiter à la source
--i:index du caractère dans le résultat
-- (utilisé après le traitement de la source)
--x:index du caractère que l'on traite dans la source (voir ThisChar)
DECLARE @n INT,@i INT,@x INT
--flag iniquant si on est en train de lie un code de formatage
--Un code de formatage commence par un Anti-Slash "" et
--considéré comme fini juste avant un autre Anti-slash,
--un espace ou un retour à la ligne.
DECLARE @GetCode TINYINT;
--Chaîne dans laquelle on stocke le code de formatage que
--l'on est en train de lire
DECLARE @Code Varchar(255);
--Caractère que l'on est en train de traiter,
--et caractère le précédant
DECLARE @ThisChar VarChar(10), @LastChar VarChar(10)
--Niveau de groupe (ou bloc) de format dans lequel on se trouve
--un groupe commence par une accolade ouverte "{" et se termine par une accolade fermée "}"
DECLARE @Groupe INT
--Flag indiquant si le caractère Thiscar doit être rejeté (True) ou recopié dans le résultat (False]
DECLARE @Skip TINYINT
SET @n = Len(@RTF)
SET @Result = ''
SET @GetCode = 0
SET @Groupe = 0
SET @LastChar = CHAR(0)
--Traitement de la source
SET @x = 1
WHILE @x<=@n
BEGIN
SET @Skip = 0
--SET @ThisChar = RTF[@x]
SET @ThisChar = SUBSTRING(@RTF, @x, 1)
IF @ThisChar = '{'
BEGIN
IF @LastChar<>'\'
BEGIN --Début de groupe
SET @Groupe = @Groupe + 1;
SET @Skip = 1;
END -- IF @LastChar<>'\'
ELSE
SET @GetCode = 0
END --IF @ThisChar = '{'
ELSE IF @ThisChar = '}'
BEGIN
If @LastChar<>'\'
BEGIN --Fin de groupe
SET @Groupe = @Groupe -1
SET @Skip = 1
END --If @LastChar<>'\'
ELSE
SET @GetCode = 0
END --IF @ThisChar = '}'
ELSE IF @ThisChar ='\'
BEGIN
if @LastChar<>'\'
BEGIN -- Début de Code de format à traiter
IF @GetCode = 1
BEGIN
IF (@ThisChar '\') OR (@ThisChar ' ') OR (@ThisChar = CHAR(13)) OR (@ThisChar = CHAR(10))
BEGIN
--si on vient de lire le code de format d'un début de paragraphe
--ou celui d'un passage à la ligne...
IF (@Code '\par') or (@Code '\line') or (@Code = '\pard')
BEGIN
--#13#10 est le code iutilisé sous Windows
--pour coder en CHAR un retour à la ligne
IF @ReplaceLineFeedWithSpace = 1
SET @Result=@Result+' '
ELSE
SET @Result=@Result+CHAR(13)+ CHAR(10)
SET @GetCode=0
SET @skip=1
END --IF (@Code '\par') or (@Code '\line') or (@Code = '\pard')
--si on vient de lire le code de format d'une tabulation
IF @Code = '\tab'
BEGIN
--#9 est le code iutilisé sous Windows --pour coder une tabulation en code CHAR
SET @Result = @Result + CHAR(9)
SET @GetCode = 0
SET @skip = 1
END --IF @Code = '\tab'
END --IF (@ThisChar '\') OR (@ThisChar ' ') OR (@ThisChar = CHAR(13)) OR (@ThisChar = CHAR(10))
--Un code de format \'xx indigue le code CHAR d'un caractère spécial
-- (lettres accentuées en particulier). xx est ce code en héxadécimal.
if ((Len(@Code) = 4) and ((SUBSTRING(@Code, 1, 1)+ SUBSTRING(@Code, 2, 1))='\'''))
BEGIN
--on retranscrit le code hexadécimal en code CHAR)
SET @Result = @Result+ CHAR(CONVERT(INT,dbo.Hexa2Int( SUBSTRING(@Code, 3, 1)+SUBSTRING(@Code, 4, 1) )))
SET @GetCode = 0
SET @skip = 1
END --if ((Len(@Code) = 4) and ((SUBSTRING(@Code, 1, 1)+ SUBSTRING(@Code, 2, 1))='\'''))
END
SET @Code=''
SET @GetCode = 1
--ELSE
-- SET @GetCode = 0 --c'était bien le caractère anti-slash --(codé en RTF avec deux anti-slashs -- successifs)
END
ELSE
SET @GetCode = 0 --c'était bien le caractère anti-slash --(codé en RTF avec deux anti-slashs -- successifs)
END
ELSE IF @ThisChar =' '
BEGIN
if @GetCode = 1
BEGIN
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ProcessCode
if (@ThisChar '\') OR (@ThisChar ' ') OR (@ThisChar = CHAR(13)) OR (@ThisChar = CHAR(10))
begin
--si on vient de lire le code de format d'un début de paragraphe
--ou celui d'un passage à la ligne...
if (@Code '\par') or (@Code '\line') or (@Code = '\pard')
begin
--#13#10 est le code iutilisé sous Windows
--pour coder en CHAR un retour à la ligne
if @ReplaceLineFeedWithSpace = 1
SET @Result=@Result+' '
else
SET @Result=@Result+CHAR(13)+ CHAR(10)
SET @GetCode=0
SET @skip=1
end
--si on vient de lire le code de format d'une tabulation
if @Code = '\tab'
begin
--#9 est le code iutilisé sous Windows --pour coder une tabulation en code CHAR
SET @Result = @Result + CHAR(9)
SET @GetCode = 0
SET @skip = 1
end
end
--Un code de format \'xx indigue le code CHAR d'un caractère spécial
-- (lettres accentuées en particulier). xx est ce code en héxadécimal.
if ((Len(@Code) = 4) and ((SUBSTRING(@Code, 1, 1)+ SUBSTRING(@Code, 2, 1))='\'''))
BEGIN
--on retranscrit le code hexadécimal en code CHAR)
SET @Result = @Result+ CHAR(CONVERT(INT, dbo.Hexa2Int(SUBSTRING(@Code, 3, 1)+SUBSTRING(@Code, 4, 1) )))
SET @GetCode = 0
SET @skip = 1
END
SET @GetCode = 0
SET @Skip = 1
END
END
ELSE IF @ThisChar = CHAR(10)
BEGIN
IF @GetCode =1
BEGIN --fin de Code de format
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ProcessCode
IF (@ThisChar '\') OR (@ThisChar ' ') OR (@ThisChar = CHAR(13)) OR (@ThisChar = CHAR(10))
BEGIN
--si on vient de lire le code de format d'un début de paragraphe
--ou celui d'un passage à la ligne...
IF (@Code '\par') or (@Code '\line') or (@Code = '\pard')
BEGIN
--#13#10 est le code iutilisé sous Windows
--pour coder en CHAR un retour à la ligne
if @ReplaceLineFeedWithSpace = 1
SET @Result=@Result+' '
else
SET @Result=@Result+CHAR(13)+ CHAR(10)
SET @GetCode=0
SET @skip=1
END
--si on vient de lire le code de format d'une tabulation
if @Code = '\tab'
BEGIN
--#9 est le code iutilisé sous Windows --pour coder une tabulation en code CHAR
SET @Result = @Result + CHAR(9)
SET @GetCode = 0
SET @skip = 1
END
END
--Un code de format \'xx indigue le code CHAR d'un caractère spécial
-- (lettres accentuées en particulier). xx est ce code en héxadécimal.
if ((Len(@Code) = 4) and ((SUBSTRING(@Code, 1, 1)+ SUBSTRING(@Code, 2, 1))='\'''))
BEGIN
--on retranscrit le code hexadécimal en code CHAR)
SET @Result = @Result+ CHAR(CONVERT(INT, dbo.Hexa2Int( SUBSTRING(@Code, 3, 1)+SUBSTRING(@Code, 4, 1) )))
SET @GetCode = 0
SET @skip = 1
END
SET @GetCode = 0
SET @Skip = 1
END
--(on est dans un groupe,
-- on ne recopie pas le "LineFeed")
if @Groupe>0 SET @Skip = 1
END
ELSE IF @ThisChar = CHAR(13)
begin
if @GetCode = 1
begin
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ProcessCode
if (@ThisChar '\') OR (@ThisChar ' ') OR (@ThisChar = CHAR(13)) OR (@ThisChar = CHAR(10))
begin
--si on vient de lire le code de format d'un début de paragraphe
--ou celui d'un passage à la ligne...
if (@Code '\par') or (@Code '\line') or (@Code = '\pard')
begin
--#13#10 est le code iutilisé sous Windows
--pour coder en CHAR un retour à la ligne
if @ReplaceLineFeedWithSpace = 1
SET @Result=@Result+' '
else
SET @Result=@Result+CHAR(13)+ CHAR(10)
SET @GetCode=0
SET @skip=1
end
--si on vient de lire le code de format d'une tabulation
if @Code = '\tab'
begin
--#9 est le code iutilisé sous Windows --pour coder une tabulation en code CHAR
SET @Result = @Result + CHAR(9)
SET @GetCode = 0
SET @skip = 1
end
end
--Un code de format \'xx indigue le code CHAR d'un caractère spécial
-- (lettres accentuées en particulier). xx est ce code en héxadécimal.
if ((Len(@Code) = 4) and ((SUBSTRING(@Code, 1, 1)+ SUBSTRING(@Code, 2, 1))='\'''))
BEGIN
--on retranscrit le code hexadécimal en code CHAR)
SET @Result = @Result+ CHAR(CONVERT(INT, dbo.Hexa2Int( SUBSTRING(@Code, 3, 1)+SUBSTRING(@Code, 4, 1) )))
SET @GetCode = 0
SET @skip = 1
END
SET @GetCode = 0
SET @Skip = 1
end
--(on est dans un groupe,
-- on ne recopie pas le "Retour chariot")
if @Groupe>0 SET @Skip = 1
end
IF @GetCode = 0
BEGIN
IF ( @Skip = 0) and (@Groupe <= 1)
BEGIN
--On a un caractère à recopier dans le résultat du traitement
--(du texte brut, pas du format)
SET @result = @result+@ThisChar
END
END
ELSE
BEGIN
--on lit le code
SET @Code = @Code + @ThisChar
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ProcessCode
if (@ThisChar '\') OR (@ThisChar ' ') OR (@ThisChar = CHAR(13)) OR (@ThisChar = CHAR(10))
begin
--si on vient de lire le code de format d'un début de paragraphe
--ou celui d'un passage à la ligne...
if (@Code '\par') or (@Code '\line') or (@Code = '\pard')
begin
--#13#10 est le code iutilisé sous Windows
--pour coder en CHAR un retour à la ligne
if @ReplaceLineFeedWithSpace = 1
SET @Result=@Result+' '
else
SET @Result=@Result+CHAR(13)+ CHAR(10)
SET @GetCode=0
SET @skip=1
end
--si on vient de lire le code de format d'une tabulation
if @Code = '\tab'
begin
--#9 est le code iutilisé sous Windows --pour coder une tabulation en code CHAR
SET @Result = @Result + CHAR(9)
SET @GetCode = 0
SET @skip = 1
end
end
--Un code de format \'xx indigue le code CHAR d'un caractère spécial
-- (lettres accentuées en particulier). xx est ce code en héxadécimal.
if ((Len(@Code) = 4) and ((SUBSTRING(@Code, 1, 1)+ SUBSTRING(@Code, 2, 1))='\'''))
BEGIN
--on retranscrit le code hexadécimal en code CHAR)
SET @Result = @Result+ CHAR(CONVERT(INT, dbo.Hexa2Int( SUBSTRING(@Code, 3, 1)+SUBSTRING(@Code, 4, 1) )))
SET @GetCode = 0
SET @skip = 1
END
END
--Préparation de la boucle suivante
SET @LastChar = @ThisChar
SET @x = @x + 1
END
--Fin du traitement de la source et
--Début de traitement du résultat obtenu
--Suppression des catractères cr/lf et espaces en fin de chaîne
SET @n = Len(@result)
while ((@n>0) and (SUBSTRING(@result, @n, 1)<' '))
SET @n = @n - 1
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!if @n>0
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!SetLength(@result,@n)
--idem mais pour le début de la chaîne
if @DoTrimLeft = 1
begin
SET @i = Len(@result)
SET @n = 0;
while (@n <= @i) and (SUBSTRING(@result, @n, 1) <= ' ')
SET @n = @n +1
--SET @result = Copy(@result, @n, Maxint)
SET @result = SUBSTRING(@result, @n, 5000 )
end;
SET @result = LTRIM(@result)
--césure du texte si l'utilisateur l'à demandé
if @TrailAfter>0
begin
IF LEN(@result)>@TrailAfter
begin
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!SetLength(@result,TrailAfter)
SET @result=@result + '...'
end
end
Return @Result
END