Vb6+recherche nbre occurence

spootnic22 Messages postés 84 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 30 janvier 2010 - 13 déc. 2006 à 21:10
lemoret Messages postés 37 Date d'inscription vendredi 10 septembre 2004 Statut Membre Dernière intervention 11 mars 2007 - 15 déc. 2006 à 17:50
Salut,
Pourriez vous me dire comment je peux calculer le nbre d'occurence d'un mot par exemple "test" qui existe dans un fichier file.txt
Merci

32 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
13 déc. 2006 à 21:18
En le parcourant ligne par ligne, entre autres possibilités . Utiliser pour celà Open... for Input .... et Line Input...

(nombreux exemples etr sujets  recurrents sur ce forum)

et en utilisant, pour chaque ligne lue : instr (aide en lignes et nombreux sujets et totoriels sur ce forum).

+ un compteur s'incrémentant de 1 unité à chaque occurence ...

Reviens avec un code d'essai en nous disant tu coinces ... et on t'aidera alors avec joie.
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 08:06
Salut, tu as snippet sur codyx pour compter le nombre d'occurance dans une chaîne!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 08:08
Le bonheur est sur codyx:http://www.codyx.org/snippet_compter-nombre-occurrence-chaine-dans-autre_158.aspx#468

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 déc. 2006 à 09:13
Euh !....

Je ne suis pas tout-à-fait d'accord avec le code de ce lien !

L'incrémentation de i (i+1) ne me satisfait pas...

Tout dépend en effet du tupe de recherche que l'on fait sur un mot !

Ainsi donc : certains rechercheront combien de fois un mot complet existe dans une chaîne de caractères et refuseront que l'on compte également le "mot contenu dans le mot" ...


 


prenons l'exemple de la chaine "il est beau, ce cocococo là"

Ques faut-il trouver en recherchant le nombre d'occurances de "coco" ? 2 ou 3 ? (hé ! hé !)

Le code du lien trouvera 3, pardi, du fait de l'incrémentation de i d'une seule unité

Si l'on veut trouver 2, il ne faut pas incrémenter i de 1 mais de len(vsPattern) !

Ceci étant dit, on peut arriver à mieux en utilisant en plus Mid, bien sur ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 09:44
T'as trois codes différents pour VB6 à toi de choisir celui qui te convient le mieux!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 déc. 2006 à 09:51
C'est tellement drôle que je ne peux m'empêcher de le dire ici, afin que vous puissiez en "rigoler" également.

En venant de passer mon rasoir sous le robinet pour le débarrasser des poils coupés, le comique qui sommeille en moi s'est réveillé !

Allons-y, donc :

1) j'attribue un sosie chainesosie =  chaineoriginelle
2) je débarrasse chainesosie des mots "motcherché" qu'elle contient (en utilisant replace)
3) nombre de mots "motcherché"  = (len(chaineoriginelle)-Len(chainesosie))/Len(motrecherché)


(Il est fou, ce jmf ...)
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 09:54
Private Sub CommandButton1_Click()

Dim tastring As String
tastring = "il est beau, ce cocococo là"

'Méthode1 nombre d'occurence=3
MsgBox Count(tastring, "coco", vbcomparemethodtext)

'Méthode2 nombre d'occurence=2
MsgBox Count1(tastring, "coco")

'Méthode3 nombre d'occurence=3
MsgBox NbInStr(1, "coco", tastring)

End Sub

Public Function Count(ByRef vsInput As String, ByRef vsPattern As String, Optional ByVal veCompare As VbCompareMethod = vbBinaryCompare) As Integer

Dim i As Long
    i = InStr(1, vsInput, vsPattern, veCompare)
    Do While i
        Count = Count + 1
        i = InStr(i + 1, vsInput, vsPattern, veCompare)
    Loop

End Function

Public Function Count1(ByVal sString As String, ByVal sFind As String) As Integer
 Count1 = UBound(Split(sString, sFind))
End Function

Public Function NbInStr(ByVal MyStart As Long, ByVal MyWord As String, ByVal MyString As String) As Long

    If MyStart < 1 Or LenB(MyWord) < 2 Or LenB(MyString) < 2 Then Exit Function

Dim i As Long, MyCounter As Long

    MyCounter = 0
    For i = MyStart * 2 - 1 To LenB(MyString) Step 2
        If MidB(MyString, i, LenB(MyWord)) = MyWord Then MyCounter = MyCounter + 1
    Next i

    NbInStr = MyCounter

End Function,

----

(Coloration syntaxique automatique par Kenji)





 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 11:13
Et la méthode gagnante est: (les codes les plus courts sont les meilleurs! Du moins dans ce cas là)



Public
 Function Count1(ByVal sString As String, ByVal sFind As String) As Integer
 Count1 = UBound(Split(sString, sFind))
End Function





 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 déc. 2006 à 13:03
Tu sais quoi, Dricke ?

Ta méthode est plus courte, c'est sur !

Mais :

Ni ton truc, ni le mien (voir plus haut) ne sont les plus rapides à l'exécution.

Pourquoi ? Tout simplement parce que tant Replace que Split ne sont que des intermédiaires.... et ils utilisent tous deux, finalement, Instr... (voire pire !)

C'est (au passage) l'un des défauts majeurs de VB.Net (qui devient à la fois plus lourd et plus lent) ....
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 13:10
C'était seulement une comparaison avec les trois codes du snippet! Ca veut seulement dire que sur les trois il y a un seul qui marche pour ta phrase d'exemple et c'est le plus court (une ligne de code). Après au niveau execcution j'en sais rien!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 déc. 2006 à 13:36
Bonjour DriKce,

Moi, je sais... mais on peut toujours "rigoler"...
Si tu veux le savoir, même Instr et Mid passent par autre chose... et Replace et Split passent par Instr et Mid avant de "passer par autre chose".....
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 13:38
Il est passer ici et il repassera par là!

Bon d'accord je sorts!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
lemoret Messages postés 37 Date d'inscription vendredi 10 septembre 2004 Statut Membre Dernière intervention 11 mars 2007
14 déc. 2006 à 15:53
C'est n'importe quoi pourvu que ca mousse. Ni Replace ni Split n'appelle la fonction Instr ni directement ne indirectement. Les trois sont des fonctions C distinctes qui utilisent un algorithme de parcours de chaine assez similaire, mais les fonctions natives de l'objet VBA n'appelle pas d'autres fonctions VB.

Quand à VB.NET il y a encore moins de rapport, sa 'lenteur' est du à son environnement d'exécution, mais l'appel instr va utiliser un code identique à l'appel IndexOf.
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 16:12
ça commence à partir en live sur ce topic! ! Enfin est ce que notre ami, auteur de cette question ,a résolu son problème au moins?

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 déc. 2006 à 17:21
Lemoret semble bien savoir comment VB a écrit son Split et son Replace ...

Travaillant avec VB5, j'ai en mon temps, comme d'autres, fait les miens, avec... instr et Mid, pardi...

Moi, je ne sais pas comment VB a, de son côté, décidé de faire ...

Une chose reste certaine : l'emploi de split est bien plus lent que l'emploi direct de Instr (et il en va de même pour Replace)
Et cette lenteur accrue se constate de façon plutôt affligeante ! Si l'on avait, par exemple, une différence de 1 milliseconde sur une chaine de 1000 octets, on n'en aurait beaucoup plus de 4 (le quadruple donc) sur une chaîne 3 fois plus grande...

J'invite Lemoret à lire ceci (celà lui évitera des tests) et salue au passage DKS.

http://www.vbfrance.com/infomsg_COMPARAISON-SPLIT-INSTR_733033.aspx
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 17:27
Non moi je ne suis pas d'accord!
Bon d'accord je sorts!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
lemoret Messages postés 37 Date d'inscription vendredi 10 septembre 2004 Statut Membre Dernière intervention 11 mars 2007
14 déc. 2006 à 17:54
Evidemment que c'est plus lent puisqu'une fonction fait juste une recherche et que l'autre fait de la séparation de chaine en tableau. Mais quel rapport avec le fait que Split appele Instr ou pas, ce que tu affirmais dans ton message précédent.
Par ailleurs la différence de vitesse ne vas pas être perceptible sur la longueur de la chaine analysée mais sur le nombre d'occurence de la chaine cherchée. Je t'invite à faire un test pour que tu comprenne bien que à aucun moment Split n'appele InStr et que la taille de la chaine n'as aucune importance par rapport au nombre d'occurence. Fais une recherche en mettant dans une chaine le fichier WIN32API.txt (667988 caractères), et recherche avec les deux méthodes Instr et Split toutes les occurences d'abord du terme 'Any', puis du terme 'Long'.
Dans le premier cas (180 occurences) les vitesses seront presque identiques, dans le second (env. 5000 occurences) le temps du Split sera plus long, encore qu'on parle là d'un centième de seconde.
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
14 déc. 2006 à 17:58
Hé bien heureusement qu'à mon faible niveau je ne m'arrête à 1/100 de seconde pour le choix entre deux codes! Je suis pas la M....... sinon!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 déc. 2006 à 18:30
Tu lis vite, Lemoret. Peut-être trop vite .

Relis ce que j'ai écrit plus haut (fin de la page 1) :

"Pourquoi ? Tout simplement parce que tant Replace que Split ne sont que desintermédiaires.... et ils utilisent tous deux, finalement, Instr... (voire pire !)"

Et le pire existe peut-être, car (après tests multiples) je continue à utiliser de préférence mes fonctions personnelles pour remplacer Replace et  Split. J'ai même une fonction Detmot (qui va rechercher le mot correspondant à un rang), une fonction Rangmot (qui va rechercher le rang d'un mot) et une fonction Comptemots (qui va compter le nombre de mots) etc... , toutes paramétrables de différentes manières.

Mais bon ! J'ai quant à moi l'habitude de tester les performances sur une machine dédiée  (très vieille et de surcroît "underclockée")  et en utilisant de très longues boucles.

Mais n'en parlons plus si tu as d('autres convictions.

Amitiés
0
lemoret Messages postés 37 Date d'inscription vendredi 10 septembre 2004 Statut Membre Dernière intervention 11 mars 2007
14 déc. 2006 à 18:46
Merci je sais encore lire, aucune des deux n'utilisent ni InStr ni pire puisque ce sont des fonctions C.
Maintenant tu peux utiliser ce que tu veux et tester tes fonctions sur une cafetière ou un vélo, mon propos n'est pas la. Je tiens juste à combattre les classiques délires autour de VB. Les fonctions natives des bibliothèques VB sont des fonctions C plutôt bien écrite.
Cependant je serais curieux de voir ces fonctions que tu utilises pour qu'on puisse comparer leurs vitesses avec celles des fonctions natives, moi je ne demande qu' à changer de convictions pour peu qu'on m'en convainque
0
Rejoignez-nous