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

C++Builder Discussion :

Recuperer les 3 mots les plus utilisés dans une page web


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut Recuperer les 3 mots les plus utilisés dans une page web
    Bonjour,

    J'ai une petite application qui doit me recuperer une page html et ensuite me recuperer et m'afficher les 3 mots les plus utilises dans cette page web.

    J'ai réussi à recuperer la page html et ensuite je l'ai stocké dans un TStringList!!!Et là je suis bloqué car je sais pas comment lire dans mon TStringList pour recuperer les 3 mots les plus utilisés dans mon fichier!!!
    ça me semble dur car dans le fichier html y a pas mal de tags(<.../>) y a pleins de trucs de ce genre!!!

    Je veux de l'aide svp pour queu je puisse avancer . Merci d'avance
    Voici ce que j'ai commencé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm1::Fonction()
    {
      AnsiString maLigne ;
      TStringList *liste = new TStringList() ;
       liste->LoadFromFile("C:\monFichier") ;
       for (i = 0; i < liste->Count; i++)
       {
         maLigne = liste->Strings[i] ;
     
       }
     
       delete liste ;
     
    }
    I need your help please!!!Merci !!!

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Salut

    C est juste une idée

    Sqlite
    une base
    une table , deux champs , mot et nombre

    Remplacer tous les espaces , les virgules , les points par des sauts à la ligne
    Ensuite creer ton tableau pour la fonction suivante

    Une fonction avec un insert ou un update
    qui boucle de i = 1er indice à tableau.length
    Avec une condition qui verifie si le mot n est pas par exemple :
    "le , un , de , et , ..."
    et
    Si le mot existe , incrementation de nombre
    Sinon insertion du nouveau mot

    Enfin une requete sql rangée par nombre decroissant
    select nom into matable order by nombre desc

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Bonjour, j'arrive toujours pas à avancer car le fichier html est tres compliqué, il y a pleins de tags genre <..../> et des "/" ect....
    Je voudrais maintenant placer chaque mot du TStringList dans un tableau et ensuite regarder combien de fois ce mot existet dans le tableau!!!Je sais pas comment decouper chaque element du TStringList car ce sont des phrase.
    Est ce quelqu'un peut m'aider??rapel :je dois recuperer les 3 mots les plus utilisés dans un fichier html.
    Est - il possible de lire par mot et les stocker dans un tableau en C++builder?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm1::Fonction()
    {
      AnsiString maLigne ;
      TStringList *liste = new TStringList() ;
       liste->LoadFromFile("C:\monFichier") ;
       for (i = 0; i < liste->Count; i++)
       {
         maLigne = liste->Strings[i] ;
     
       }
     
       delete liste ;
     
    }
    Je vous remercie d'avance. I need your help please!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Ya personne pour m'aider?
    j'ai besoin d'aide svp, je cherche depuis des jours mais c'est tres compliqué je vois aucune solution de comment lire un fichier web ou html que j'ai recuperer à partir d'une URL et retourner les 3 mots les plus utilisé dans la page!!!

    Help please! et merci d'avance

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Dans ton autre sujet , on t a filé un lien vers la faq qui explique comment recuperer le ""corps "" d une page web afficher dans un browser , le ""corps"" signifie : un ensemble de mots , dépourvu des balises

    Ensuite je t ai expliqué comment faire avec sqlite ...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Merci pour tout ton aide Cedni et tout le monde aussi! Mais j'ai toujours pas trouver mon bonheur!!

    Cedni tu m'as parlé de Sqlite ? je connais pas du tout encore moins les requêtes sql qui ne font pas parti de mon prijet.
    Dans mon projet je dois utiliser la méthode Get du composant TIdHTTP et c'est bien efficace car en mettant l'url et un TStream il nous récupère la page html correspond!!!

    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
    bool __fastcall TForm1::loadHtml(AnsiString AUrl, TMemoryStream *StreamString)
    {
      bool download = false ;
       try
       {
    	  idhttp->Get(AnsiString(AnsiString(Url)).c_str(), StreamString) ;
    	  download = true ;
     
       }
       catch (...)
       {
    	  download = false ;
     
       }
     
       delete StreamString ;
     
       return download ;
    appel de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TForm1::BoutonClick(TObject *Sender)
    {
      AnsiString AdresseURL = AURL->Text ;
      memory = new TMemoryStream() ;
      downloadHtml(AdresseURL, memory) ;
    }
    Mon gros problème est que j'arrive pas à exploiter le texte que j'ai récupérer!!!Comment je peux accéder à ce que j'ai récupère dans la mémoire?Sinon aussi je peux le stocker dans un TFileStream mais là le problème aussi c'est que j'ai un fichier inexploitable avec pleins de balises de partout!!!

    En outre avec le code que m'a fourni Crayon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void __fastcall TForm1::WebBrowserDocument(TObject *ASender, const IDispatch *pDisp, OleVariant &URL)
    {  .........
    }
    Je sais pas quoi mettre comme paramètre quand j'appelle cette fonction dans un evenement click?
    Si quelqu'un peut m'aider svp!!Merci d'avance

  7. #7
    Membre très actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Par défaut
    Citation Envoyé par lisco Voir le message
    le problème aussi c'est que j'ai un fichier inexploitable avec pleins de balises de partout!!!

    En outre avec le code que m'a fourni Crayon :
    En effet tu récupères le code de la page html, c'est à dire avec toutes les balises <HTML><Body> etc.

    Personnellement j'utiliserais plus dans ton cas un TCppWebBrowser, qui te permet de choisir si tu veux récupérer tout le code ou seulement le texte.

    Ne récupère que le texte, et après tu peux créer un tableau 2D, une colonne avec la liste des mots et l'autre avec le nombre de fois où tu les rencontre en scannant ta page web de haut en bas.

    Je n'ai pas le code du TCppWebBrower sous la main mais fais une recherche sur ce forum, il y est ( je l'avais trouvé ici ^^ )

    En gros, tu poses le composant TCppWebBrower sur ton interface graphique, tu poses un bouton, tu doubles clique dessus et tu mets un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WideString Url = "www.google.fr";
    TCppWebBrowser1->Navigate(Url);
    puis dans la methode ondocumentcomplete ou un truc comme ça, tu mets le fameux code pour récupérer le texte seulement.

    Il te restera le code de comptage de mots à faire par contre.

    Voilà, c'est une autre solution possible, mais la solution que t'as proposé Cedni doit certainement bien marcher également.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Soit ...

    Donc pour commencer , reperer la body et supprimmer le code la precedant .

    Ensuite la fonction AnsiPos sur < , tu obtiens une premiere valeur
    Continuer sur > , une seconde valeur
    Recuperer la chaine de caractere qui va de la position 1 à 2
    Faire un replace de cette chaine par un espace ( replace flags )
    Eventuellement boucler ou voir voir si il n y a pas un parametre "all" à passer

    Recommencer les ansipos pour trouver les <>

    C est laborieux , c est clair , alors qu un browser te donnerait le corps

    Apres un tableau 2d , oui mais bon je ne sais pas si tu vas trouver une fonction toute faite pour tester l existence du mot et/ou une autre pour trier ta liste

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Voici un simple essai qui demanderait à être amélioré mais qui semble fonctionner en l'état.

    Sur la fiche principale j'ai placé un TRichEdit pour faire écho du résultat ainsi qu'un bouton pour charger le fichier à l'aide d'une TOpenDialog.

    Le fichier est traité comme un binaire, donc chargé en mémoire dans un simple tableau de char.

    Dans le constructeur de la fiche (Form1) j'intialise un tableau Ok[256] pour modifier ou non les caractères sans avoir à implémenter de tests (qui pénalisent en terme de rapidité d'exécution).
    En clair tout ce qui n'est pas une lettre (A ... z) sera mis à 0 !

    Les mots seront donc ensuite détectés plus facilement (séparés par un ou plusieurs 0) et plus faciles à convertir en AnsiString.

    Les mots sont stockés dans un simple StringList.

    Chaque compteur puisé dans le tableau Count, est associé à l'item via la propriété Objects sous la forme d'une pointeur (vers un élément du tableau).

    Au final, j'affiche tous les mots détectés avec la valeur de leur compteur.

    Donc à toi de compléter pour filtrer les résultats selon tes propres besoins !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //REM
    #include <stdio.h>
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    #define max_size 1000000
    #define half_size 500000
     
    char Buffer[max_size];
    short Count[half_size];
    TStringList *List;
    char Ok[256];
     
    //-----
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    List = new TStringList;
    char j;
    //Initialisation du filtre
    for(j = 'A'; j <= 'Z'; j++) Ok[j]=j;
    for(j = 'a'; j <= 'z'; j++) Ok[j]=j;
    }
    //-----
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
        {
        FILE *htm = fopen(OpenDialog1->FileName.c_str(), "rb");
        fseek(htm, 0, SEEK_END);
        int max = ftell(htm);
        if(max > max_size)
            {
            fclose(htm);
            return;
            }
        fseek(htm, 0, SEEK_SET);
        fread(Buffer, 1, max, htm);
        fclose(htm);
     
        // On purge ... 
        List->Clear();
        RichEdit1->Lines->Clear();
     
        // Et on traite...
        int n;
        char *p = Buffer;
        char *s = p;
        char *e = p + max;
        short *count;
        // Une première passe pour supprimer les caractères "parasites"
        while(s < e)
            {
            *s = Ok[*s];
            s++;
            }
        // La deuxième passe ... sans commentaires ...
     
        s = Buffer;
        while(s < e)
            {
            if(*s != 0)
                {
                s++;
                }
            else
                {
                if(strlen(p) == 0)
                    {
                    s++;
                    p = s;
                    }
                else
                    {
                    n = List->IndexOf(p);
                    if(n == -1)
                        {
                        n = List->Count;
                        Count[n] = 1;
                        List->AddObject(p, (TObject*)&Count[n]);
                        }
                    else
                        {
                        count = (short*)List->Objects[n];
                        (*count)++;
                        }
                    p = s;
                    }
                }
            }
        for(int j = 0; j < List->Count; j++)
            {
            RichEdit1->Lines->Add(List->Strings[j] +
                                  " = " +
                                  IntToStr( *(short*)List->Objects[j] ) );
            }
        }
    }
    //-----
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    List->Clear();
    delete List;
    }
    A plus !

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Oui et non puisque dans <td> , tu trouves t et d

    J insiste donc sur un browser , recuperer le corps et toute autre maniere d analyser le tableau

    Apres si je me trompe , corrigez moi ( meconnaissance du TRichEdit )

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Dans le tableau, le filtrage sur <td> impose : 0, 't', 'd', 0
    Comme le pointeur (p) pointe sur le 't', la conversion en AnsiString traite une suite de caractères jusqu'à la détection d'un caractère NUL.
    Et dans le cas présent, on engrange "td" à partir de : 't','d', NUL
    Le 't' de "td" ne peut jamais se retrouver dissocié de "td" puisqu'il est suivi de 'd' qui est suivi de NUL !

    A plus !

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Bonjour, et merci Henderson et à tout le monde!!!
    j'ai compilé ce code ça marche bien !!!mais j'arrive pas à trier pour recuperer uniquement les 3 mots ou 5 mots les plus cités car dans le TSringList est contenu des chaines de caracteres!!! Je vois pas trop sur quoi bouclés pour trier mon TStringList pour recuperer les mots les plus cites??
    Je dois boucler suivant Strings ou suivant Objects ?

    Merci d'avance!

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    çà j avais compris mais tu te retrouves avec tes balises depourvues de "<" et ">"

    Ensuite tu peux avoir une section <head> ou autres scripts contenant des metanames ou des noms de variables ...

    il devrait recuperer le corps ...

    Des methodes de tri , tu n en trouveras pas de toutes faites

  14. #14
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    ... sauf que les "mots dans le fichier" ... j'y mets pour l'instant tous les mots qui peuvent être vus comme tels donc y compris tout ce qui y est signifié en tant que balises !
    Donc faut-il négliger les balises ou pas ?
    Et alors par rapport à quelles balises ?

    A plus !

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    A vue de nez , c est un generateur de metaname qu il veut realiser donc à mon avis , juste les mots visibles lors d un classique affichage dans un browser

    D où la recup du corps


    Par contre , existe t il une fonction pour faire un "sort" sur un stringlist ?

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    je galère pour trier mon TStringList, suite au code que m'a fourni henderson , je veux trier le TStringList pour mettre les éléments dans un ordre décroissant et ensuite afficher les 3 mots les plus utiliser c'est a dire les 3 premiers !!Le code de trier que j'ai fait ne marche pas!!!
    Si vous avez des idées svp :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
                      short *count ;
    		  short *count2 ;
    		  short *tmp ;
                       int imax ;
     
           while(s < e)
    		  {
    			*s = Ok[*s] ;
    			 s++;
    		  }
        // La deuxième passe ... sans commentaires ...
     
    		  s = Buffer ;
    		  while(s < e)
    		  {
    		   if(*s != 0)
    		   {
    			s++ ;  //On forme le mot à lire.
    		   }
    		   else
    		   {
    			if(strlen(p) == 0)
    			{
    			   s++ ;
    			   p = s ;
    			}
    			else
    			{
    				n = List->IndexOf(p) ;
    				if(n == -1)
    				{
    					n = List->Count ;
    					Count[n] = 1;
    					List->AddObject(p, (TObject*)&Count[n]) ;
    				}
    				else
    				{
    					count = (short*)List->Objects[n] ;
    					(*count)++ ;
    				}
    				p = s ;
    			}
    		   }
    		  }
    //Voici le code pour faire le trier :

    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
    for (int i = 0 ; i < List->Count ; i++)
    			  {
    				   count2  = ((short*)List->Objects[i]) ;
    				   imax = i ;
     
    				 for (int j = i+1; j < List->Count - 1; j++)
    				 {
    					if(count2 < ((short*)List->Objects[j]))
    					{
    						count2 =  ((short*)List->Objects[j]) ;
     
    						imax = j ;
    					}
    					  tmp = ((short*)List->Objects[imax]) ;
    					  (*(short*)List->Objects[imax]) = (*(short*)List->Objects[j]) ;
    					  (*(short*)List->Objects[j]) = *tmp ;
    				 }
     
    			  }
    le trie est bon mais ça fait rien!!!help please!!!

  17. #17
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Comme j'utilise BCB3 Pro, je ne dispose pas de TStringList doté d'une méthode Sort du type de celle de TList, et je cite :

    typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2);
    void __fastcall Sort(TListSortCompare Compare);
    A vérifier chez vous !

    Par contre ...
    Je suis de ce fait dans l'obligation de développer deux classes pour parvenir à faire le tri non pas à partir du texte mais à partir de la valeur du compteur.
    Alors voici comment j'ai développé tout ça :

    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
    30
    31
     
    class jMot : public TComponent
    {
    public :
    char *Text;
    int Count;
        __fastcall jMot(TComponent *AOwner, char *AText);
        __fastcall ~jMot();
    };
     
    class jListeMots : public TComponent
    {
    protected :
        jMot* __fastcall GetMot(int N);
        int __fastcall GetCount();
    public :
    TList *List;
        __fastcall jListeMots(TComponent *AOwner);
        __fastcall ~jListeMots();
     
        int __fastcall IndexOf(char *Text);
     
        void __fastcall Add(char *Text);
     
        void __fastcall Sort();
     
        void __fastcall Purge();
     
    __property jMot* Mots[int N]={read=GetMot};
    __property int Count={read=GetCount};
    };

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    //-------- méthodes de la classe jMot
    __fastcall jMot::jMot(TComponent *AOwner, char *AText)
        : TComponent(AOwner)
    {
    Text = AText;
    Count = 1;
    }
    //--
    __fastcall jMot::~jMot()
    {
    }
    //--
     
     
    //-------- méthodes de la classe jListeMots
    __fastcall jListeMots::jListeMots(TComponent *AOwner)
        : TComponent(AOwner)
    {
    List = new TList();
    }
    //--
    __fastcall jListeMots::~jListeMots()
    {
    List->Clear();
    delete List;
    }
    //--
    jMot* __fastcall jListeMots::GetMot(int N)
    {
    return (jMot*)List->Items[N];
    }
    //--
    int __fastcall jListeMots::GetCount()
    {
    return List->Count;
    }
    //--
    int __fastcall jListeMots::IndexOf(char *Text)
    {
    for(int j = 0; j < List->Count; j++)
        {
        if(strcmp(Mots[j]->Text, Text) == 0) return j;
        }
    return -1;
    }
    //--
    void __fastcall jListeMots::Add(char *Text)
    {
    int p = IndexOf(Text);
    if(p == -1) List->Add( new jMot(this, Text) );
    else Mots[p]->Count++;
    }
    //-- méthode pour Sort
    int __fastcall Compare(void* Item1, void* Item2)
    {
    //tri décroissant
    jMot *M1 = (jMot*)Item1;
    jMot *M2 = (jMot*)Item2;
    if(M1->Count < M2->Count) return 1;
    if(M1->Count == M2->Count) return 0;
    return -1;
    }
    //--
    void __fastcall jListeMots::Sort()
    {
    List->Sort( Compare );
    }
    //--
    void __fastcall jListeMots::Purge()
    {
    while(ComponentCount != 0)
        {
        delete (jMot*)Components[0];
        }
    List->Clear();
    }
    En ce qui concerne Form1, voici ce qu'il en advient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define max_size 1000000
    char Buffer[max_size];
    jListeMots *List;
    char Ok[256];
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    //--
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    List = new jListeMots(this);
    char j;
    for(j = 'A'; j <= 'Z'; j++) Ok[j]=j;
    for(j = 'a'; j <= 'z'; j++) Ok[j]=j;
    }
    //--
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
        {
        FILE *htm = fopen(OpenDialog1->FileName.c_str(), "rb");
        fseek(htm, 0, SEEK_END);
        int max = ftell(htm);
        if(max > max_size)
            {
            fclose(htm);
            return;
            }
        fseek(htm, 0, SEEK_SET);
        fread(Buffer, 1, max, htm);
        fclose(htm);
        char *p = Buffer;
        char *s = p;
        char *e = p + max;
     
        while(s < e)
            {
            *s = Ok[*s];
            s++;
            }
        s = Buffer;
     
        List->Purge();
     
        while(s < e)
            {
            if(*s != 0)
                {
                s++;
                }
            else
                {
                if(strlen(p) == 0)
                    {
                    s++;
                    p = s;
                    }
                else
                    {
                    List->Add(p);
                    p = s;
                    }
                }
            }
        AnsiString N;
        List->Sort();
        RichEdit1->Lines->Clear();
        for(int j = 0; (j < 3) && (j < List->Count); j++)
            {
            N = List->Mots[j]->Text;
            RichEdit1->Lines->Add(N + " = " + IntToStr(List->Mots[j]->Count));
            }
        }
    }
    Alors bien évidemment ... que faut-il extraire au juste comme "mots" ...

    A plus !

Discussions similaires

  1. Rafraichir 3 images dans une page web toute les minutes
    Par jameson dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/06/2011, 13h49
  2. Logiciel pour récupérer que les mails dans une page web
    Par mouss4rs dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 24/07/2010, 14h41
  3. Trouver le mot le plus long dans une chaîne
    Par bassoum dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 02/11/2008, 10h45
  4. Lire les mails d'un serveur Exchange dans une page php
    Par ljonathan dans le forum Langage
    Réponses: 2
    Dernier message: 18/08/2008, 11h48
  5. Réponses: 5
    Dernier message: 06/08/2006, 19h38

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