cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 2018
-
20 mai 2006 à 20:24
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 2018
-
22 mai 2006 à 20:55
Bonsoir à tous....
Je n'arrive pas à trouver la synthaxe qui replace x espaces par un seul espace.
Ma variable "ligne" est extraite d'un recordest d'une base Access.
Ex:
ligne = " DPR E8EEEEEEE_a biblio copies=3"
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 21 mai 2006 à 00:03
While Instr(Ligne," ")<>0
Ligne = Replace$(Ligne," "," ")
Wend
MsgBox "__" & Ligne & "__"
Cette petite boucle tourne tant qu'il existe au moins deux espaces consécutifs dans la variable Ligne.
Elle remplace alors toute occurence de deux espace consécutifs, par un seul.
A force de tourner ainsi, tu finis par ne plus avoir que des espaces simples.
Sinon avec le Split, tu peux faire ceci :
Dim T() As String
Dim i As Long
T = Split(Ligne, " ")
ligne = ""
For i = 0 To UBound(T)
If T(i) <> "" Then ligne = ligne & T(i) & " "
Next
If Len(ligne) > 0 Then ligne = Left(ligne, Len(ligne) - 1)
MsgBox "__" & ligne & "__"
On éclate la ligne dans le tableau T() par un split(), puis avec une boucle sur chaque item du tableau, si celui-ci est différent d'une chaine vide, on le concatène à la ligne avec un espace derrière.
En fin de boucle, si la longueur de la ligne reconstruite est différente de zéro , on supprime le dernier caractère car il s'agit d'un espace ajouté en trop au dernier tour de boucle.
olixelle
Messages postés506Date d'inscriptionvendredi 30 juillet 2004StatutMembreDernière intervention 3 mars 20082 20 mai 2006 à 23:59
je ne maitrise pas vbs mais tu peux chercher parmi les solutions suivantes:
- utiliser les expression régulières avec replace
- faire une boucle en remplacant " " par " " jusqu'à ce qu'il ny ait plus de " " dans la chaine (surement la solution la plus simple:
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 21 mai 2006 à 00:24
Salut, ou cela
Ex:
ligne = " DPR E8EEEEEEE_a biblio copies=3"
ligne = c_Replace(Text1, " ", " ")
MyArray = Split(ligne, " ", -1, 1) 'creation du tableau
.......
.......
.......
If Len(ligne) > 0 Then ligne = Left(ligne, Len(ligne) - 1)
MsgBox "__" & ligne & "__"
Private Function c_Replace(Expression As String, Find As String, Replace As String) As String
Dim i
Dim ligne
For i = 1 To Len(Expression)
If Mid(Expression, i, 1) <> Find Then
ligne = ligne & Mid(Expression, i, 1)
Else
If Right(ligne, 1) <> " " Then ligne = ligne & Replace
End If
Next
c_Replace = ligne
End Function
Dim T, i
T = Split(ligne, " ")
ligne = ""
For i = 0 To UBound(T)
If T(i) <> "" Then ligne = ligne & T(i) & " "
Next
If Len(ligne) > 0 Then ligne = Left(ligne, Len(ligne) - 1)
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201827 21 mai 2006 à 11:22
Bonjour à tous....
Bonjour Renfield,
Je parcours environ 800 tables d'une base access (100 Mo).
lignes parcourues: environ 600.000
lignes concernées par le "DPR....": environ 350
1er test (adapté en vbs) fonctionne - temps identique à While...Wend => 11"
2ème test (adapté en vbs) ne plante pas, mais il me concatène certaines lignes- temps => 15"
Finalement, je reste sur le While.
Merci quand même.
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 21 mai 2006 à 22:42
Pour Renfield VB à aussi une fonction replace mais qui ne fonctionne pas dans ce cas là. Elle remplace caractère par caractère donc pas bon ici. En ce qui concerne VBS je n'y connais rien j'ai assez de mal avec VB et VBA puisque la programation est pour moi un Hobby, et que je n'ai jamais suivi de cours.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 22 mai 2006 à 08:15
j'ai testé ta fonction. voyant les premières boucles, j'ai pensé qu'elle fonctionnait...
mais en creusant un peu, j'ai vu :
If Mid(Expression, i, 1) <> Find Then
ce qui te bloque illlico : Find peut avoir une longueur supérieure à 1.
Concernant la fonction Replace de VB6, je suis, rassures toi parfaitement conscient de son existence ^^
il faudrait cependant la placer, dans ce cas, dans une boucle Do While.
lorsque la fonction Replace travaille, elle va allouer, de la mémoire,
pour stocker le résultat. Elle doit le faire 3-4 fois, par exemple,
dans ce cas. C'est cette allocation répétée qui est "couteuse".
rien de dramatique, et je chipotte sur ce coup là, je le sais bien...
j'ai fais le test dans un cas improbable (2 000 000) d'itérations...
reste que ma version est plus rapide (en VB6, et surtout en compilé.)
l'idée, ici, est (tout comme ta fonction) de n'effectuer qu'un seul
passage sur la chaine, quoiqu'il arrive. Je ne lis pas non plus
caractère par caractère, utilisant InstrB, pour trouver directement un
espace...