SUPPRIMER LES ESPACES, SAUF CEUX ENTRE GUILLEMETS.

Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 - 6 avril 2004 à 21:39
Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 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.

https://codes-sources.commentcamarche.net/source/21729-supprimer-les-espaces-sauf-ceux-entre-guillemets

Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
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

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 ... :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
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és 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
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)

End Function