Qlik Community

Groupe des Utilisateurs Francophones

cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Recherche de mot-clé dans un champ texte et en fonction du résultat insertion d'une valeur dans un autre champ

Bonjour,

Je but sur le problème suivant depuis quelques jours, et je ne vois pas comment le résoudre. Je vais essayer d'être le plus clair possible afin que vous me donniez votre avis s'il vous plait.

J'ai deux tables :

     - table DOSSIER avec comme champs DOSSIER_ID, DOSSIER_INFO, .... Le champ DOSSIER_INFO contient des textes du type "problème urgent à résoudre pour telle date"

     - table KEYWORDS avec les champs KEYWORD_ID, KEYWORD (par exemple: urgent), KEYWORD_VAL

Ce que je souhaite pouvoir :

1) Au chargement de la table DOSSIER, pour chaque dossier, vérifier s'il y a des infos complémentaires (DOSSIER_INFO non vide)

2) Si oui, parcourir les infos complémentaires

3) Si dans les infos complémentaires il y a un mot clé (KEYWORD) référencé dans la table KEYWORDS, alors ajouter un champ KEYWORD_ID à la table DOSSIER et y affecter la valeur correspondante

4) Si pas de mot clé dans les infos complémentaires affecter la valeur 0 au champ KEYWORD_ID de la table dossier

Est-ce envisageable?

Si oui, comment procéder?

Merci par avance,

N'hésitez pas à me demander des précisions si je n'ai pas été assez clair.

1 Solution

Accepted Solutions
rlp
Creator
Creator

Il vous faut rajouter un champ KEYWORD_ID à la tabel DOSSIER, en génratn dynamiquement son expression à partir des données de la table KEYWORDS.

Pour la structure de l'expression, le plus simple est d'utiliser la syntaxe:

pick( wildmatch( DOSSIER_INFO , '*KEYWORD_1*' , '*KEYWORD_2*', ....,'*')

          ,

          KEYWORD_ID_1 , KEYWORD_ID_2 ,..... , 0

) as KEYWORD_ID

Il nous faut donc générer deux chaînes de caractères avec concat et pour s'assurer qu'elles sont dans le bon ordre, on utilisera le second paramètre optionnel, poids que l'on affectera à RecNo() .

Ce qui donne le code suivant:

tmp_expression :

NoConcatenate

LOAD

          Concat( DISTINCT

               chr(39) & '*' & KEYWORD & '*' & chr(39) ,

               ' , ' ,

               RecNo()

          ) as matching_expression

     ,

     Concat( DISTINCT KEYWORD_ID , ' , ', RecNo() ) as return_expression

RESIDENT KEYWORD

WHERE KEYWORD <> ''

;

LET matching_expression = peek( 'matching_expression' , -1 , 'tmp_expression' ) ;

LET return_expression       = peek( 'return_expression'       , -1 , 'tmp_expression' ) ;

DROP TABLE tmp_expression ;

LEFT JOIN( DOSSIER)

LOAD DISTINCT

     DOSSIER_INFO ,

     pick(

               wildmatch( DOSSIER_INFO , $(matching_expression) , '*' )

               ,

               $(return_expression) , 0

     ) as KEYWORD_ID

RESIDENT DOSSIER ;

Ce message a été modifié par: Richard Pressanti: Consolidation de l'expression suite aux problèmes indiqués dans le post suivant.

Ce message a été modifié par: Richard Pressanti: Correction d'une erreur de frappe au niveau du Concat( .. KEYWORD ...)

View solution in original post

14 Replies
rlp
Creator
Creator

Il vous faut rajouter un champ KEYWORD_ID à la tabel DOSSIER, en génratn dynamiquement son expression à partir des données de la table KEYWORDS.

Pour la structure de l'expression, le plus simple est d'utiliser la syntaxe:

pick( wildmatch( DOSSIER_INFO , '*KEYWORD_1*' , '*KEYWORD_2*', ....,'*')

          ,

          KEYWORD_ID_1 , KEYWORD_ID_2 ,..... , 0

) as KEYWORD_ID

Il nous faut donc générer deux chaînes de caractères avec concat et pour s'assurer qu'elles sont dans le bon ordre, on utilisera le second paramètre optionnel, poids que l'on affectera à RecNo() .

Ce qui donne le code suivant:

tmp_expression :

NoConcatenate

LOAD

          Concat( DISTINCT

               chr(39) & '*' & KEYWORD & '*' & chr(39) ,

               ' , ' ,

               RecNo()

          ) as matching_expression

     ,

     Concat( DISTINCT KEYWORD_ID , ' , ', RecNo() ) as return_expression

RESIDENT KEYWORD

WHERE KEYWORD <> ''

;

LET matching_expression = peek( 'matching_expression' , -1 , 'tmp_expression' ) ;

LET return_expression       = peek( 'return_expression'       , -1 , 'tmp_expression' ) ;

DROP TABLE tmp_expression ;

LEFT JOIN( DOSSIER)

LOAD DISTINCT

     DOSSIER_INFO ,

     pick(

               wildmatch( DOSSIER_INFO , $(matching_expression) , '*' )

               ,

               $(return_expression) , 0

     ) as KEYWORD_ID

RESIDENT DOSSIER ;

Ce message a été modifié par: Richard Pressanti: Consolidation de l'expression suite aux problèmes indiqués dans le post suivant.

Ce message a été modifié par: Richard Pressanti: Correction d'une erreur de frappe au niveau du Concat( .. KEYWORD ...)

Not applicable
Author

Merci Richard,

c'est exactement ce dont j'ai besoin.

Il y a juste au niveau du concat suivant qu'il y a un soucis je pense:

     Concat(chr(39) & '*' & KEYWORD * '*' & chr(39) , ' , ' , RecNo()) as matching_expression,

car au final dans le champ KEYWORD_ID  de ma table DOSSIER j'ai toujours la même valeur (ici 1, et qui ne correspond pas au mot clé associé).

J'ai essayer de le modifier ainsi:

      Concat(chr(39) & '*' & KEYWORD & '*' & chr(39) , ' , ' , RecNo()) as matching_expression,

mais là je n'ai plus aucune valeur dans mes champs KEYWORD_ID.

Etant novice, je ne suis pas à l'aise avec la syntaxe de QV et ne parviens pas à rectifier cette ligne.

Ou alors mon problème vient d'ailleur?

rlp
Creator
Creator

Essayez de remplacer Concat(...) par Concat( DISTINCT .. ) dans les deux expressions.

Si cela ne marche pas, allez dans Paramètres -> Apercu des variables : examinez les deux expressions: normalement les valeurs correspondantes de KEYWORD et KEYWORD_ID devraient être dans le même ordre.

Eventuellement postez ces deux expressions.

Vérifier également qu'il n'y ait pas de chaînes vides dans le champ KEYWORD associé à la valeur 1 de KEYWORD_ID car sinon çela générera le motif '**' qui matche toute chaîne de caractères: la valeur ré&currente 1 serait alors expliquée. Si c'est le cas, rajoutez:

WHERE KEYWORD <> ''

au chargement/concat

Bon courage!

Not applicable
Author

Merci pour les pistes,

- l'ajout du DISTINCT dans les 2 expression ne change rien

- ma table KEYWORDS a la forme suivante (et sans chaine vide)

   KEYWORD_ID, KEYWORD, KEYWORD_VAL

  1, PA1, 500

   2, urgent, 250

- Dans l'aperçu des variables :

  Nom de la variable / Valeur

   return_expression / 1,2

   matching_expression / '*','*'

C'est donc au niveau de la variable matching_expression que le bas blesse.

Voici le code utilisé:

tmp_expression :

NoConcatenate

LOAD Concat(chr(39) & '*' & KEYWORD * '*' & chr(39), ',' ,RecNo()) as matching_expression,

     Concat(KEYWORD_ID, ',', RecNo() ) as return_expression

RESIDENT KEYWORDS ;

LET matching_expression = peek( 'matching_expression' , -1 , 'tmp_expression' ) ;

LET return_expression = peek( 'return_expression' , -1 , 'tmp_expression' ) ;

DROP TABLE tmp_expression ;

CASE:

Load CASE_ID,

        CASE_ADDITIONAL_INFO,

         ....,

        pick( wildmatch( CASE_ADDITIONAL_INFO , $(matching_expression) , '*' ), $(return_expression)) as KEYWORD_ID;

rlp
Creator
Creator

Effectivement, j'ai commis une erreur de frappe en tapant l'expression:

Il ne faut pas ecrire :

Concat(chr(39) & '*' & KEYWORD * '*' & chr(39), ',' ,RecNo())

mais :

Concat(chr(39) & '*' & KEYWORD & '*' & chr(39), ',' ,RecNo())

Not applicable
Author

Bonjour,

Je me permets de fournir une autre solution. J'avais commencé à la réaliser avant la réponse de Richard, je la poste pour qu'elle ne soit pas perdue.

Trouve ci-joint une appli avec script commenté point par point pour réaliser ta demande.

A ta dispo pour en rediscuter.

Amand

Not applicable
Author

Avec la seconde expression, j'ai bien dans l'aperçu des variable:

   Nom de la variable / Valeur

   return_expression / 1,2

   matching_expression / '*PA1*','*urgent*'

Par contre dans ma table DOSSIER, le champ KEYWORD_ID est à '-' au lieu de '0' .

Je ne vois pas pour quelle raison, ni comment y remédier.

Not applicable
Author

Bonjour Amand,

Merci beaucoup pour votre réponse et le temps passé pour rédiger le script.

Malheureuseument j'ai une version d'essai qui m'empêche d'ouvrir les projets QV que je n'ai pas créés moi-même.

Peut être pouvez-vous copier/coller directement le script ici?

Not applicable
Author

Voici le contenu de mon script :

//Chargement des dossiers
Dossier:
LOAD ID_DOSSIER,
DOSSIER_INFO,

//On identifie les lignes comportant des infos complémentaires
     if(len(trim(DOSSIER_INFO))>0,'O','N') as Flag_info_complémentaire
FROM
Dossier_keyword.xlsx
(
ooxml, embedded labels, table is Dossier);

//Chargement des keywords
Keyword:
LOAD ID_Keyword,
Keyword
FROM
Dossier_keyword.xlsx
(
ooxml, embedded labels, table is Keyword);

//On compte le nombre de lignes dans la table des keywords

LET NbKeywords = NoOfRows('Keyword');


//Pour chacun des mot clé
For i=0 to $(NbKeywords)-1

//On récupère le keyword à l'index spécifié par la variable i
LET vKeywordEnCours = peek('Keyword',$(i),'Keyword') ;
LET vIDKeywordEnCours = peek('ID_Keyword',$(i),'Keyword') ; //De même pour l'id
    
//Création d'une table contenant tous les liens dossier_keyword
Lien_Dossier_Keyword:
LOAD ID_DOSSIER,
'$(vIDKeywordEnCours)'
as ID_Keyword
Resident Dossier

//On ne traite que les lignes flaguées dans dossier
Where Flag_info_complémentaire='O'

//La recherche du kyword dans le texte s'effectue ici
and WildMatch(DOSSIER_INFO,'*$(vKeywordEnCours)*');

Next i;


En espérant que cela puisse aider.

Amand