OVH Cloud OVH Cloud

calcul du nombre de chaque mot d'un texte

51 réponses
Avatar
eric.zzzz
Bonjour,
Comment calculer le nombre de chaque mot d'un texte (en word ou en pdf que =
je pourrais copier dans excel si n=E9cessaire)
Merci d'avance

10 réponses

2 3 4 5 6
Avatar
moi
"DanielCo" a écrit dans le message de news:
kqf194$4ag$
j'ai attendu plus d'un quart d'heure et j'ai arrêté.

Pour hier soir, je précise que le code s'est planté sur la ligne de code
: .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13
et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2



Je viens de faire un essai sur 13700 lignes. La macro a pris 10 mn 11 sec.
Ca dépend évidemment plus du nombre de mot que du nombre de lignes. Du
processeur aussi. J'ai corrigé le décompte qui était faux parfois. Je vais
essayer avec ce qu' a dit GL. Voici le code modifié :

Sub Compte()
Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico As
Object
Dim Result() As Long
deb = Timer
Application.ScreenUpdating = False
Sheets(2).[A:B].ClearContents
Tabl = Array("'", "(", ")", ".", ";", "=") 'etc.
For Each Item In Tabl
[A:A].Replace Item, " "
Next Item
Set Dico = CreateObject("Scripting.Dictionary")
For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100
With Sheets(1)
Txt = ""
Dico.RemoveAll
ReDim Result(0)
Ctr = -1
For Each C In .Range(.Cells(i, 1), .Cells(i + 99, 1).End(xlUp))
Txt = Txt & " " & C.Value
Next C
Txt = Right(Txt, Len(Txt) - 1)
Tabl = Split(Txt, " ")
For Each Item In Tabl
If Item <> "" Then
If Not Dico.exists(Item) Then
Dico.Add Item, Item
Ctr = Ctr + 1
ReDim Preserve Result(Ctr)
Result(Ctr) = Result(Ctr) + 1
Else
Pos = Application.Match(Item, Dico.items, 0)
Result(Pos - 1) = Result(Pos - 1) + 1
End If
End If
Next Item
End With
With Sheets(2)
For x = 0 To Dico.Count - 1
Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1
Var = Dico.items
If Not IsNumeric(Application.Match(Var(x), .[A:A], 0)) Then
Var1 = Var(x)
.Cells(Ligne, 1).Value = Var(x)
.Cells(Ligne, 2) = Result(x)
Else
Ligne = Application.Match(Var(x), .[A:A], 0)
.Cells(Ligne, 2) = .Cells(Ligne, 2) + Result(x)
End If
Next x
End With
Next i
MsgBox Timer - deb
Application.ScreenUpdating = True
End Sub

Daniel



Non, je ne suis pas préssé, s'il faut attendre 1 heure y a pas de soucis,
je viens de lancer l'exécution depuis 3 mn (chez moi c'est mieux qu'au
bureau); mais il faut attendre combien de temps avant de se dire : laisse
tomber



--- news://freenews.netfront.net/ - complaints: ---
Avatar
DanielCo
A priori, c'est le ReDim Preserve qui va manger beaucoup de temps
en cas de boucle longue : chaque ReDim Preserve va réallouer de la
mémoire et aussi recopier les données dans la nouvelle plage de mémoire
(équivalent de c "realloc")

En principe, comme en c :
- soit on alloue un tableau d'une taille suffisamment grande dès le
départ. Pendant la boucle, il n'y a pas d'allocation. En fin de
boucle, on réalloue à une taille inférieure (ce qui n'est fait
qu'une seule fois donc, et en plus ne nécessite pas la recopie
des données, donc très rapide).

- soit on ne sait vraiment pas choisir une borne sup pour la taille
du tableau, et dans ce cas on alloue dynamiquement en progression
géométrique :

1ere allocation : MemSize = 1000 par exemple
ReDim Result(MemSize)
puis : Si Ctr >MemSize
MemSize = 2 * MemSize
ReDim Preserve Result(MemSize)
Ainsi le nombre de réallocation est en
log_2(nombre total des données)

Et à la fin : ReDim Preserve Result (<Taille finale>)
avec Taille Finale < la valeur courante de MemSize

C'est la méthode générale d'allocation dynamique d'un buffer
de taille inconnue.

Cdt.



J'ai fait un test, le même que le précédent (en traitant par lots de
100 lignes) et en ne faisant qu'un seul dimensionnement de la table par
lot. Bizarrement, j'obtiens 10 mn 33 sec et 10 mn 31 sec (pour
confirmation), soit environ 20 sec de plus qu'avec la macro initiale.
Daniel
Avatar
moi
"DanielCo" a écrit dans le message de news:
kqfdkv$bu0$
A priori, c'est le ReDim Preserve qui va manger beaucoup de temps
en cas de boucle longue : chaque ReDim Preserve va réallouer de la
mémoire et aussi recopier les données dans la nouvelle plage de mémoire
(équivalent de c "realloc")

En principe, comme en c :
- soit on alloue un tableau d'une taille suffisamment grande dès le
départ. Pendant la boucle, il n'y a pas d'allocation. En fin de
boucle, on réalloue à une taille inférieure (ce qui n'est fait
qu'une seule fois donc, et en plus ne nécessite pas la recopie
des données, donc très rapide).

- soit on ne sait vraiment pas choisir une borne sup pour la taille
du tableau, et dans ce cas on alloue dynamiquement en progression
géométrique :

1ere allocation : MemSize = 1000 par exemple
ReDim Result(MemSize)
puis : Si Ctr >MemSize
MemSize = 2 * MemSize
ReDim Preserve Result(MemSize)
Ainsi le nombre de réallocation est en
log_2(nombre total des données)

Et à la fin : ReDim Preserve Result (<Taille finale>)
avec Taille Finale < la valeur courante de MemSize

C'est la méthode générale d'allocation dynamique d'un buffer
de taille inconnue.

Cdt.



J'ai fait un test, le même que le précédent (en traitant par lots de 100
lignes) et en ne faisant qu'un seul dimensionnement de la table par lot.
Bizarrement, j'obtiens 10 mn 33 sec et 10 mn 31 sec (pour confirmation),
soit environ 20 sec de plus qu'avec la macro initiale.
Daniel



J'ai utilisé le dernier code proposé, au bout de 35 mn j'ai laissé tomber
Je t'ai contacté par email, mais j'ai reçu un Undelivered Mail Returned to
Sender



--- news://freenews.netfront.net/ - complaints: ---
Avatar
moi
"DanielCo" a écrit dans le message de news:
kqfdkv$bu0$
J'ai fait un test, le même que le précédent (en traitant par lots de 100
lignes) et en ne faisant qu'un seul dimensionnement de la table par lot.
Bizarrement, j'obtiens 10 mn 33 sec et 10 mn 31 sec (pour confirmation),
soit environ 20 sec de plus qu'avec la macro initiale.
Daniel




J'ai copier sous excel un PDF au lieu d'un word, et ainsi j'ai un ficher
excel de 900 lignes (chaque ligne contenant beaucoup plus de mots) :
l'exécution a duré 54 secondes
un peti souci : il me met en double tous les mots suivis de virgule...



--- news://freenews.netfront.net/ - complaints: ---
Avatar
DanielCo
Non, je ne suis pas préssé, s'il faut attendre 1 heure y a pas de soucis,
je viens de lancer l'exécution depuis 3 mn (chez moi c'est mieux qu'au
bureau); mais il faut attendre combien de temps avant de se dire : laisse
tomber



Seule réponse sensée :
Comme le disait Fernand Raynaud (voir Wikipedia pour les plus jeunes)
"- un certain temps."
Avatar
DanielCo
"DanielCo" a écrit dans le message de news:
kqfdkv$bu0$
J'ai fait un test, le même que le précédent (en traitant par lots de 100
lignes) et en ne faisant qu'un seul dimensionnement de la table par lot.
Bizarrement, j'obtiens 10 mn 33 sec et 10 mn 31 sec (pour confirmation),
soit environ 20 sec de plus qu'avec la macro initiale.
Daniel




J'ai copier sous excel un PDF au lieu d'un word, et ainsi j'ai un ficher
excel de 900 lignes (chaque ligne contenant beaucoup plus de mots) :
l'exécution a duré 54 secondes
un peti souci : il me met en double tous les mots suivis de virgule...



--- news://freenews.netfront.net/ - complaints: ---



Peux-tu mettre 3 ou 4 lignes (avec des virgules)sur cjoint.com.
Avatar
moi
"DanielCo" a écrit dans le message de news:
kqgqba$plt$
"DanielCo" a écrit dans le message de news:
kqfdkv$bu0$
J'ai fait un test, le même que le précédent (en traitant par lots de 100
lignes) et en ne faisant qu'un seul dimensionnement de la table par lot.
Bizarrement, j'obtiens 10 mn 33 sec et 10 mn 31 sec (pour confirmation),
soit environ 20 sec de plus qu'avec la macro initiale.
Daniel




J'ai copier sous excel un PDF au lieu d'un word, et ainsi j'ai un ficher
excel de 900 lignes (chaque ligne contenant beaucoup plus de mots) :
l'exécution a duré 54 secondes
un peti souci : il me met en double tous les mots suivis de virgule...




Peux-tu mettre 3 ou 4 lignes (avec des virgules)sur cjoint.com.



je me suis mélangé les pinceaux, non le texte de 900 lignes n'était pas le
bon
pour les virgules et autres ponctuation, je peux les enlever avec CtrlH

j'ai mis 3 lignes du fichier excel sur cjoint.com (c'est la 1re fois que je
l'utilise), mais je ne comprends pas à quoi ça sert ?
Le mieux ne serait-il pas que tu prennes n'importe quel .doc ou .PDF de ton
ordi ou alors télécharge un gros .doc ou un gros PDF



--- news://freenews.netfront.net/ - complaints: ---
Avatar
moi
"DanielCo" a écrit dans le message de news:
kqgqba$plt$


Peux-tu mettre 3 ou 4 lignes (avec des virgules)sur cjoint.com.



http://cjoint.com/?3FBlrGK9dDS



--- news://freenews.netfront.net/ - complaints: ---
Avatar
moi
Le jeudi 27 juin 2013 09:41:37 UTC+2, DanielCo a écrit :
> "DanielCo" a écrit dans le message de news:




Peux-tu mettre 3 ou 4 lignes (avec des virgules)sur cjoint.com.



J'ai pensé à un truc : réduire le nombre de lignes de A1 à A12000
en concatant A5 avec A4 avec A3 avec A2 avec A1; on aura 5 fois moins de
lignes
Avatar
DanielCo
Ce n'est pas le nombre de lignes qui compte, mais le nombre total de
mots.
Daniel


Le jeudi 27 juin 2013 09:41:37 UTC+2, DanielCo a écrit :
"DanielCo" a écrit dans le message de news:








Peux-tu mettre 3 ou 4 lignes (avec des virgules)sur cjoint.com.



J'ai pensé à un truc : réduire le nombre de lignes de A1 à A12000
en concatant A5 avec A4 avec A3 avec A2 avec A1; on aura 5 fois moins de
lignes
2 3 4 5 6