SQL / RTF / Recherche

braderic Messages postés 7 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 5 mai 2008 - 5 mai 2008 à 14:35
eto95 Messages postés 2 Date d'inscription mercredi 3 mars 2004 Statut Membre Dernière intervention 25 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 .....

Existe t il d'autres solutions ???

Pour info j'utilise SQLITE comme BD.

Merci

2 réponses

yvessimon Messages postés 637 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 9 janvier 2017
5 mai 2008 à 16:36
Bonjour,

Il y a bien sur d'autres solutions.

Avec ACCESS ou EXCEL ....

Salutations
0
eto95 Messages postés 2 Date d'inscription mercredi 3 mars 2004 Statut Membre Dernière intervention 25 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)

--Select @Result = RTrim(@Result)
--Select @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
0
Rejoignez-nous