Remplacer x espaces par un seul espace

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 20 mai 2006 à 20:24
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 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"

MyArray = Split(ligne, " ", -1, 1) 'creation du tableau
MsgBox ligne & vbCrLf & "var0: " & MyArray(0) & "  var1: " & MyArray(1) & "  var2: " & MyArray(2) &_
       "  var3: " & MyArray(3) & "  var4: " & MyArray(4)

ne me renvoie pas obligatoirement
MyArray(0) = "DPR"
MyArray(1) = "E8EEEEEEE_a"
MyArray(2) = "biblio"
MyArray(3) = "copies=3"
MyArray(4) = "" 'si vide

Si ligne = "DPR E8EEEEEEE_a biblio copies=3" mon tableau est bonne.

Si quelqu'un a une idée (VB6 ou autres)  pour mon petit problème.
Je ne fais pas de VB6, mais j'arrive, en pricipe, à l'adapter en vbs.

Merci.
Jean-Marc

12 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
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.

CR
3
olixelle Messages postés 506 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 3 mars 2008 2
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:
0
olixelle Messages postés 506 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 3 mars 2008 2
21 mai 2006 à 00:00
Le code en vbnet:

dim ligne as string " DPR E8EEEEEEE_a biblio copies=3"
do while ligne.indexof(" ") > -1
ligne = ligne.replace(" ", " ")
loop
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
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

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0

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

Posez votre question
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
21 mai 2006 à 07:56
 Bonjour à tous....

Merci  315759 olixelle , =143123 crenaud76  et 218510 valtrase pour vos réponses.
J'ai opté (test ok) pour la fonction split de =143123 crenaud76 

      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)

MyArray = Split(ligne, " ", -1, 1) 'creation du tableau
MsgBox ligne &vbCrLf&vbCrLf & "var0: " & MyArray(0) &vbCrLf& "var1: " & MyArray(1) &_
       vbCrLf& "var2: " & MyArray(2) &vbCrLf& "var3: " & MyArray(3)

jean-marc
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
21 mai 2006 à 08:34
 Bonjour à tous....

Le While ...Wend fonctionne aussi.
'      While Instr(Ligne,"  ")<>0
'         Ligne = Replace(Ligne,"  "," ") 
'      Wend

Même elapse entre le split et le while.

Bonne journée à tous.
jean-marc
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 mai 2006 à 10:20
j'ai pas trop saisi quelques petits détails....

olixelle, pourquoi donner le code en vb.net ?  (pour du VBS :s)

valtrase, pourquoi implémentes tu Replace à ta façon ? vbs possède une fonction Replace :p


pour accélerer l'algo, j'ai changé le Instr en InstrB :


Private Function CleanSpaceChars(ByRef vsInput As String) As String

    CleanSpaceChars = Trim$(vsInput)

    Do While InStrB(CleanSpaceChars, "  ") > 0

        CleanSpaceChars = Replace(CleanSpaceChars, "  ", " ")

    Loop

End Function


cependant, une implémentation maison est plus rapide ^^ l'idée, c'est de ne parcourir la chaine qu'une seule fois...

Pas sur que son passage en vbs preserve ce gain..... au pire, la voici, pour VB6 ^^


Private Function CleanSpaceChars2(ByVal vsInput As String) As String

Dim i As Long

Dim nPos As Long

    vsInput = Trim$(vsInput)


    i = 1

    Do

        nPos = InStrB(i, vsInput, " ")

        If nPos = 0 Then

            CleanSpaceChars2 = CleanSpaceChars2 & MidB$(vsInput, i)

            Exit Function

        Else

           
CleanSpaceChars2 = CleanSpaceChars2 & MidB$(vsInput, i, nPos - i +
2)

            i = nPos + 2

            Do While MidB$(vsInput, i, 2) = " "

                i = i + 2

            Loop

        End If

    Loop

End Function

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
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.

jean-marc
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 mai 2006 à 12:24
je t'ai dit.... cet algo a de l'interet que pour VB6..... la difference est surtout sensible dans un Exe ^^


et VBS, sur ce point........

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
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.

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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...


bonne journée ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
22 mai 2006 à 20:55
 Bonjour à tous....

Waouh...
Cette question/réponse est visualisée par un nombre impressionnant de supporters de ce forum !!!!

jean-marc
0
Rejoignez-nous