Remplacer x espaces par un seul espace [Résolu]

cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 20 mai 2006 à 20:24 - Dernière réponse : cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
crenaud76 4172 Messages postés mercredi 30 juillet 2003Date d'inscription 9 juin 2006 Dernière intervention - 21 mai 2006 à 00:03
3
Merci
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

Merci crenaud76 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de crenaud76
olixelle 520 Messages postés vendredi 30 juillet 2004Date d'inscription 3 mars 2008 Dernière intervention - 20 mai 2006 à 23:59
0
Merci
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:
Commenter la réponse de olixelle
olixelle 520 Messages postés vendredi 30 juillet 2004Date d'inscription 3 mars 2008 Dernière intervention - 21 mai 2006 à 00:00
0
Merci
Le code en vbnet:

dim ligne as string " DPR E8EEEEEEE_a biblio copies=3"
do while ligne.indexof(" ") > -1
ligne = ligne.replace(" ", " ")
loop
Commenter la réponse de olixelle
valtrase 936 Messages postés lundi 19 janvier 2004Date d'inscription 17 mars 2017 Dernière intervention - 21 mai 2006 à 00:24
0
Merci
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é
Commenter la réponse de valtrase
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 21 mai 2006 à 07:56
0
Merci
 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
Commenter la réponse de cs_JMO
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 21 mai 2006 à 08:34
0
Merci
 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
Commenter la réponse de cs_JMO
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 21 mai 2006 à 10:20
0
Merci
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
Commenter la réponse de Renfield
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 21 mai 2006 à 11:22
0
Merci
 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
Commenter la réponse de cs_JMO
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 21 mai 2006 à 12:24
0
Merci
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
Commenter la réponse de Renfield
valtrase 936 Messages postés lundi 19 janvier 2004Date d'inscription 17 mars 2017 Dernière intervention - 21 mai 2006 à 22:42
0
Merci
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é
Commenter la réponse de valtrase
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 22 mai 2006 à 08:15
0
Merci
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
Commenter la réponse de Renfield
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 22 mai 2006 à 20:55
0
Merci
 Bonjour à tous....

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

jean-marc
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.