SUPPRIMER LES ESPACES, SAUF CEUX ENTRE GUILLEMETS.
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 2010
-
6 avril 2004 à 21:39
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 2010
-
8 avril 2004 à 16:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 20105 8 avril 2004 à 16:57
J'avais pas envie de faire de boucles ...
Non, en fait, j'ai 2 (petites excuses) :
1) je me suis mis à Lisp, et tout ce fait récursivement (en principe)
2) je pensais appeler récursivement ma fonction pas pour chaque caractère, mais pour chaque espace :
Function DeleteSpace(MaChaine As String, Efface As Boolean) As String
Dim N1 As Integer, N2 As Integer
Dim S1 As String, S2 As String
Dim Eff As Boolean
If (0 < N1 And N1 < N2) Or N2 = 0 Then
If Not Efface Then S1 = " "
Else
Eff = Not Eff
N1 = N2
End If
S1 = Left(MaChaine, N1 - 1) & S1
S2 = Right(MaChaine, Len(MaChaine) - N1)
If S2 <> "" Then S1 = S1 & DeleteSpace(S2, Eff)
DeleteSpace = S1
End Function
Voilà, c'est moins gourmand. Et pour des textes de 10 mots de toute façon ... :)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 7 avril 2004 à 22:54
Ta fonction m'effraies, VbLover !!
Elle fonctionne, je ne dis pas le contraire....
Ce qui m'effraies le plus dans ta fonction, c'est le fait qu'elle soit récursive !!
Ca implique en fait un appel supplémentaire par caractère de ta chaine de départ...... c'est super gourmand, dis donc !!
Tu pourrais bien sur me répondre que vus les PC qu'ont a maintenant....... reste qu'il n'est pas interdit de chercher a optimiser ;)
Function DeleteSpace(ByRef MaChaine As String) As String
Dim i As Long
Dim Efface As Boolean
Dim Char As String * 1
For i = 1 To Len(MaChaine)
Char = Mid$(MaChaine, i, 1)
Select Case Char
Case "'"
Efface = Not Efface
Case " "
If Not Efface Then
DeleteSpace = DeleteSpace & Char
End If
Case Else
DeleteSpace = DeleteSpace & Char
End Select
Next i
End Function
Voici ce que j'aurais fait...
Ca fonctionne aussi, mais c'est moins gourmand (et plus rapide, je pense aussi ;) )
A bon entendeur.....
Scalpweb
Messages postés1467Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention 5 mai 20104 7 avril 2004 à 11:22
En effet, ça bouclait à l'infini. Petit problème que j'ai résolu. Merci à vbLover. Je pense que ça doit marcher maintenant ! Désolé !
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 20105 6 avril 2004 à 21:39
Effectivement, petite faute de recopiage ("Nextpace") mais bon..
Sinon : j'ai essayé
DeleteSpace "salut' 'la companie !"
mais ça boucle infini...
Je pense qu'une version récursive irait bien :
(l'appel est : DeleteSpace("Mon texte",true)
Function DeleteSpace(MaChaine As String, Efface As Boolean) As String
Dim S1 As String, S2 As String
Dim Eff As Boolean
If MaChaine = "" Then Exit Function
Eff = Efface
S1 = Left(MaChaine, 1)
S2 = Right(MaChaine, Len(MaChaine) - 1)
Select Case S1
Case "'": Eff Not Efface: S1 ""
Case " ": If Eff Then S1 = ""
End Select
DeleteSpace = S1 & DeleteSpace(S2, Eff)
8 avril 2004 à 16:57
Non, en fait, j'ai 2 (petites excuses) :
1) je me suis mis à Lisp, et tout ce fait récursivement (en principe)
2) je pensais appeler récursivement ma fonction pas pour chaque caractère, mais pour chaque espace :
Function DeleteSpace(MaChaine As String, Efface As Boolean) As String
Dim N1 As Integer, N2 As Integer
Dim S1 As String, S2 As String
Dim Eff As Boolean
N1 = InStr(MaChaine, " ")
N2 = InStr(MaChaine, "'")
S1 = ""
Eff = Efface
If (0 < N1 And N1 < N2) Or N2 = 0 Then
If Not Efface Then S1 = " "
Else
Eff = Not Eff
N1 = N2
End If
S1 = Left(MaChaine, N1 - 1) & S1
S2 = Right(MaChaine, Len(MaChaine) - N1)
If S2 <> "" Then S1 = S1 & DeleteSpace(S2, Eff)
DeleteSpace = S1
End Function
Voilà, c'est moins gourmand. Et pour des textes de 10 mots de toute façon ... :)
7 avril 2004 à 22:54
Elle fonctionne, je ne dis pas le contraire....
Ce qui m'effraies le plus dans ta fonction, c'est le fait qu'elle soit récursive !!
Ca implique en fait un appel supplémentaire par caractère de ta chaine de départ...... c'est super gourmand, dis donc !!
Tu pourrais bien sur me répondre que vus les PC qu'ont a maintenant....... reste qu'il n'est pas interdit de chercher a optimiser ;)
Function DeleteSpace(ByRef MaChaine As String) As String
Dim i As Long
Dim Efface As Boolean
Dim Char As String * 1
For i = 1 To Len(MaChaine)
Char = Mid$(MaChaine, i, 1)
Select Case Char
Case "'"
Efface = Not Efface
Case " "
If Not Efface Then
DeleteSpace = DeleteSpace & Char
End If
Case Else
DeleteSpace = DeleteSpace & Char
End Select
Next i
End Function
Voici ce que j'aurais fait...
Ca fonctionne aussi, mais c'est moins gourmand (et plus rapide, je pense aussi ;) )
A bon entendeur.....
7 avril 2004 à 11:22
6 avril 2004 à 21:39
Sinon : j'ai essayé
DeleteSpace "salut' 'la companie !"
mais ça boucle infini...
Je pense qu'une version récursive irait bien :
(l'appel est : DeleteSpace("Mon texte",true)
Function DeleteSpace(MaChaine As String, Efface As Boolean) As String
Dim S1 As String, S2 As String
Dim Eff As Boolean
If MaChaine = "" Then Exit Function
Eff = Efface
S1 = Left(MaChaine, 1)
S2 = Right(MaChaine, Len(MaChaine) - 1)
Select Case S1
Case "'": Eff Not Efface: S1 ""
Case " ": If Eff Then S1 = ""
End Select
DeleteSpace = S1 & DeleteSpace(S2, Eff)
End Function