IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Extraire chaque mot d'un champ d'une table avec une requête


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Points : 124
    Points
    124
    Par défaut Extraire chaque mot d'un champ d'une table avec une requête
    Bonjour,
    Pour des besoins d'analyse statistique (résultat d'un petit questionnaire) je cherche à extraire tous les mots saisis par les personnes ayant répondu à une question ouverte (champ de saisi libre). Voici par l'exemple ce que je voudrais :

    Réponse 1 : "J'aime beaucoup les endives"
    Réponse 2 : "Je préfère les tomates"
    Réponse n : "Mon légume préféré c'est les saucisses de Strasbourg"

    Je voudrais que ma requête me renvoit les résultats suivants :

    J'aime
    beaucoup
    les
    endives
    Je
    préfère
    tomates
    Mon
    légume
    préféré
    c'est
    saucisses
    de
    Strasbourg

    Merci par avance pour votre aide.
    Bien à vous
    el

  2. #2
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Bonjour,

    dans un module standard, écris cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function eclater_mot(phrase As String)
     
    t = Split(phrase, " ")
     
    For i = 0 To UBound(t)
    eclater_mot = eclater_mot & Chr(13) & Chr(10) & t(i)
    Next i
    eclater_mot = Mid(eclater_mot, 3) 'on supprime le premier retour charriot
    End Function
    Ensuite, tu l'appelles dans ta requête

    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Points : 124
    Points
    124
    Par défaut
    Merci beaucoup,

    Je viens de tester ta fonction qui m'amène à prendre conscience que ma description n'était pas assez précise...

    Avec ta fonction et l'exemple que je donne dans mon premier post, la requête ne retourne que 3 résultats avec pour chacun, les mots clés avec des sauts de ligne entre chaque mot clé. Mon idée était plutôt d'avoir une requête qui, à partir de mes 3 enregistrements retourne 14 résultats (14 lignes avec une ligne pour chaque mot).

    Cela est-il possible ?

    Merci par avance.
    el

  4. #4
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Re,
    en fait en relisant, ta formulation était bien correcte.

    Oui il suffit de boucler sur la table.

    Je te ponds le code dans un moment.

    A+

    EDIT : ah non, tu veux 14 enregistrements d'un mot, ce n'est pas pareil.
    Du coup j'ai à l'esprit la création d'une table temporaire.

  5. #5
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Voici le code à mettre n'importe où

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dim db As DAO.Database, rs1 As DAO.Recordset, rs2 As DAO.Recordset
    Set db = CurrentDb
    Set rs1 = db.OpenRecordset("Tabletest", dbOpenDynaset) 'table contenant le champ avec les phrase (rs1)
    Set rs2 = db.OpenRecordset("Tabletemp", dbOpenDynaset) 'table temporaire à créer au préalable une bonne fois pour toutes (rs2)
     
    DoCmd.SetWarnings False 'empêche les messages d'alerte
    DoCmd.RunSQL "DELETE * FROM Tabletemp " 'on efface les enregistrements de la table temporaire
    DoCmd.SetWarnings True 'on remet les messsages
     
    With rs1 ' on travaille avec la table contenant le champ avec les phrases
        .MoveFirst 'on se met au début
        Do While Not .EOF 'tant que l'on n'a pas parcouru l'ensemble de la table
            t = Split(.Fields("Texte")) 'on éclate les mots de l'enregistrement contenu dans le champ [texte] de la table
            For i = 0 To UBound(t) 'pour tous les mots
                With rs2 'on travaille avec la table temporaire (rs2)
                    .AddNew 'on se met en mode ajout
                    !cnom = t(i) 'on affecte au champ [cnom] de la table temporaire le mot en cours
                    .Update 'on applique l'ajout
                End With
            Next i
            .MoveNext 'enregistrement suivant
        Loop
    End With
     
    DoCmd.OpenTable "tabletemp"
     
    'libération des objets
    Set rs1 = Nothing
    Set rs2 = Nothing

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Points : 124
    Points
    124
    Par défaut
    Merci beaucoup !

    Je teste dans la journée et je te tiens informé.
    el

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Points : 124
    Points
    124
    Par défaut
    Hello HDU71000,

    J'ai testé dans la matinée et ça marche nickel !

    C'est même assez rapide (j'avais peur que ce soit assez long à s'exécuter car j'ai plusieurs milliers de lignes à "découper").

    Merci infiniment pour ton aide.
    el

  8. #8
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Si tu as plusieurs milliers de lignes et que tu es amené à utiliser cette fonction, tu feras attention à ce que ta base ne grossisse pas trop, pour cela coches la case 'compacter lors de la fermeture' dans Options, Base de données active.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Calcul d'écart de valeur entre chaque ligne d'un champ d'une requête
    Par Ahlmael dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/12/2014, 12h54
  2. [AC-2010] Extraire la valeur d'un champ d'une table liée dans un formulaire
    Par breweryfr dans le forum IHM
    Réponses: 8
    Dernier message: 07/11/2014, 18h33
  3. [Toutes versions] Séparer chaque mot dans un champ
    Par ddtk90 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 25/10/2010, 11h58
  4. Réponses: 8
    Dernier message: 27/08/2009, 14h01
  5. [MySQL] Affecter chaque enregistrement d'un champ a une variable
    Par DjChat dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/05/2008, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo