Accueil > > > COMPACTAGE D'UNE SÉRIE NUMÉRIQUE
COMPACTAGE D'UNE SÉRIE NUMÉRIQUE
Information sur la source
Description
Il s'agit de 2 petites fonctions très simples, permettant de "compacter" une suite d'entiers, ou plus exactement de l'écrire sous une forme plus dense. Exemple: 1,2,3,4,6,9,10,11 ==> 1:4,6,9:11 La fonction décompacte fait le travail inverse (1:3,5 -> 1,2,3,5) Rien de bien extraordinaire, mais à ajouter pourquoi pas à une librairie de fonctions de manipulation de texte.
Source
- Option Explicit
-
- '---------------------------------------------------------------------------------------
- ' Procedure : Compacte
- ' DateTime : 24/07/2006 20:29
- ' Author : Jean-Marc
- ' Purpose : Compacte une "collection" de valeurs déja triées en
- ' ordre croissant.
- ' Exemple : 1,2,3,4,6,9,10,11 ==> 1:4,6,9:11
- '
- '---------------------------------------------------------------------------------------
- '
- Public Function Compacte(ByVal cdata As Collection) As String
- Dim idx As Long ' parcours de la collection
- Dim vidx As Long ' valeur (possible) du premier element d'une suite
- Dim vc As Long ' valeur courante
- Dim vp As Long ' valeur precedente
- Dim suite As Boolean ' flag indiquant si l'état courant est dans une suite ou non
- Dim tmpResult As String ' construction du résultat final par concaténations successives
-
- If cdata.Count = 0 Then ' si il n'y a pas d'éléments, quitte et retourne une chaine vide
- Exit Function
- End If
- vidx = cdata.Item(1) ' initialisations, avec le premier élément
- vp = vidx
- For idx = 2 To cdata.Count ' parcours à partir du second
- vc = cdata.Item(idx) ' récupération de la valeur courante
- If (vp + 1) = vc Then ' si elle suit immédiatement la valeur précédente
- suite = True ' on est dans une suite
- Else
- If suite Then ' sinon, on regarde si on était dans une suite
- ' si oui, on concatene la suite, qui part de vidx jusqu'à vp
- tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
- Else ' si non, on concatene la valeur précédente
- tmpResult = tmpResult & "," & CStr(vp)
- End If
- vidx = vc ' on réinitialise le premier élément d'une suite potentielle
- suite = False ' et on reset le flag de suite
- End If
- vp = vc ' stockage de la valeur courante dans vp
- Next idx
- If suite Then ' traitement final, identique à celui qui est dans la boucle
- tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
- Else
- tmpResult = tmpResult & "," & CStr(vp)
- End If
- Compacte = Mid$(tmpResult, 2) ' élimination de la première virgule
- End Function
-
- '---------------------------------------------------------------------------------------
- ' Procedure : Decompacte
- ' DateTime : 25/07/2006 20:15
- ' Author : Jean-Marc
- ' Purpose : Decompacte une chaine produite par compacte
- ' Exemple : 1:4,6,9:11 ==> 1,2,3,4,6,9,10,11
- '
- '---------------------------------------------------------------------------------------
- '
- Public Function Decompacte(ByVal data As String) As String
- Dim t() As String ' split la chaine
- Dim i As Long ' parcours des éléments de la chaine
- Dim j As Long ' génération des suites
- Dim p As Long ' cherche les suites grace au signe :
- Dim tmpResult As String ' résultat intermédiaire, construite par concatenation
-
- If data = vbNullString Then ' si chaine vide, retourne vide
- Exit Function
- End If
-
- t = Split(data, ",") ' split avec les virgules
- For i = LBound(t()) To UBound(t()) ' parcours
- p = InStr(t(i), ":")
- If p <> 0 Then ' est ce une suite (a:b)
- ' si oui, parcours de 'a' à 'b'
- For j = Val(Mid$(t(i), 1, p - 1)) To Val(Mid$(t(i), p + 1))
- tmpResult = tmpResult & "," & CStr(j)
- Next j
- Else
- tmpResult = tmpResult & "," & CStr(t(i)) ' sinon ajoute juste l'élément
- End If
- Next i
- Decompacte = Mid$(tmpResult, 2) ' retourne le resultat, en éliminant la première virgule
-
- End Function
-
- '
- ' exemple de compactage
- '
- Private Sub Command1_Click()
- Dim cc As Collection
- Dim result As String
-
- Set cc = New Collection
- cc.Add (1): cc.Add (2): cc.Add (3): cc.Add (4): cc.Add (6): cc.Add (9): cc.Add (10): cc.Add (11)
- result = Compacte(cc)
- Debug.Print result;: If result = "1:4,6,9:11" Then Debug.Print " ==> OK" Else Debug.Print " ==> KO"
- End Sub
-
- '
- ' exemple décompactage
- '
- Private Sub Command2_Click()
- Dim s As String
- Dim r As String
-
- s = "2:5,6,7,9:13,15:17,19,20"
- r = Decompacte(s)
- Debug.Print s & " => " & r
- End Sub
Option Explicit
'---------------------------------------------------------------------------------------
' Procedure : Compacte
' DateTime : 24/07/2006 20:29
' Author : Jean-Marc
' Purpose : Compacte une "collection" de valeurs déja triées en
' ordre croissant.
' Exemple : 1,2,3,4,6,9,10,11 ==> 1:4,6,9:11
'
'---------------------------------------------------------------------------------------
'
Public Function Compacte(ByVal cdata As Collection) As String
Dim idx As Long ' parcours de la collection
Dim vidx As Long ' valeur (possible) du premier element d'une suite
Dim vc As Long ' valeur courante
Dim vp As Long ' valeur precedente
Dim suite As Boolean ' flag indiquant si l'état courant est dans une suite ou non
Dim tmpResult As String ' construction du résultat final par concaténations successives
If cdata.Count = 0 Then ' si il n'y a pas d'éléments, quitte et retourne une chaine vide
Exit Function
End If
vidx = cdata.Item(1) ' initialisations, avec le premier élément
vp = vidx
For idx = 2 To cdata.Count ' parcours à partir du second
vc = cdata.Item(idx) ' récupération de la valeur courante
If (vp + 1) = vc Then ' si elle suit immédiatement la valeur précédente
suite = True ' on est dans une suite
Else
If suite Then ' sinon, on regarde si on était dans une suite
' si oui, on concatene la suite, qui part de vidx jusqu'à vp
tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
Else ' si non, on concatene la valeur précédente
tmpResult = tmpResult & "," & CStr(vp)
End If
vidx = vc ' on réinitialise le premier élément d'une suite potentielle
suite = False ' et on reset le flag de suite
End If
vp = vc ' stockage de la valeur courante dans vp
Next idx
If suite Then ' traitement final, identique à celui qui est dans la boucle
tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
Else
tmpResult = tmpResult & "," & CStr(vp)
End If
Compacte = Mid$(tmpResult, 2) ' élimination de la première virgule
End Function
'---------------------------------------------------------------------------------------
' Procedure : Decompacte
' DateTime : 25/07/2006 20:15
' Author : Jean-Marc
' Purpose : Decompacte une chaine produite par compacte
' Exemple : 1:4,6,9:11 ==> 1,2,3,4,6,9,10,11
'
'---------------------------------------------------------------------------------------
'
Public Function Decompacte(ByVal data As String) As String
Dim t() As String ' split la chaine
Dim i As Long ' parcours des éléments de la chaine
Dim j As Long ' génération des suites
Dim p As Long ' cherche les suites grace au signe :
Dim tmpResult As String ' résultat intermédiaire, construite par concatenation
If data = vbNullString Then ' si chaine vide, retourne vide
Exit Function
End If
t = Split(data, ",") ' split avec les virgules
For i = LBound(t()) To UBound(t()) ' parcours
p = InStr(t(i), ":")
If p <> 0 Then ' est ce une suite (a:b)
' si oui, parcours de 'a' à 'b'
For j = Val(Mid$(t(i), 1, p - 1)) To Val(Mid$(t(i), p + 1))
tmpResult = tmpResult & "," & CStr(j)
Next j
Else
tmpResult = tmpResult & "," & CStr(t(i)) ' sinon ajoute juste l'élément
End If
Next i
Decompacte = Mid$(tmpResult, 2) ' retourne le resultat, en éliminant la première virgule
End Function
'
' exemple de compactage
'
Private Sub Command1_Click()
Dim cc As Collection
Dim result As String
Set cc = New Collection
cc.Add (1): cc.Add (2): cc.Add (3): cc.Add (4): cc.Add (6): cc.Add (9): cc.Add (10): cc.Add (11)
result = Compacte(cc)
Debug.Print result;: If result = "1:4,6,9:11" Then Debug.Print " ==> OK" Else Debug.Print " ==> KO"
End Sub
'
' exemple décompactage
'
Private Sub Command2_Click()
Dim s As String
Dim r As String
s = "2:5,6,7,9:13,15:17,19,20"
r = Decompacte(s)
Debug.Print s & " => " & r
End Sub
Conclusion
Note: la fonction compactage prend une collection en argument d'entrée, on peut très simplement la modifier ou la décliner en différentes versions: avec un tableau, une chaine de caractère, etc.
Historique
- 26 juillet 2006 21:00:12 :
- Précision sur la fonction Compacte
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Drag d'un fichier depuis l'explorer vers une zone Texte d'une feuille : help ! [ par GEDDi ]
Question bete mais je ne sais pas comment faire :J'ai une feuille(Form1) avec une zone de Texte (Text1) et je veux 'Draguer'un fichier venant de l"exp
ecrire dand un txt [ par Nic ]
comment ecrire un texte dans un fichiers txt car je voudrais faire entrer un texte dans un textbox et en cliquant sur un bouton le faire inscrire dans
Texte & Images [ par MEYS David ]
Comment réaliser une page qui comprent du texte et des images similaire a worddans une feuille en vb6Comment convertir une image BMP en JPGComment enr
Texte & Images [ par MEYS David ]
Comment réaliser une page qui comprent du texte et des images similaire a worddans une feuille en vb6Comment convertir une image BMP en JPGComment enr
Insérer du texte dans un textbox [ par phil ]
Salut !J'ai un textbox,je suis a un endroit donne dans le contenu du textbox (exemple : en plein milieu).Je clique sur un bouton et je veux qu'a l'end
Enregistrement d'un fichier texte [ par JCLK ]
J'utilise cette commande pour enregistrer un fichier texte, mais il y a un problème : des guillemets s'affichent au début et à la fin du texte. Commen
Manipulation des données dans un texte !! [ par beber ]
debutant 100% voir plus !Recherche comment ouvrir un fichier contenant des variables X et Y d'une fonction. Puis d'arriver sous VB à les recuperer pou
Gestion de caractères d'un fichier texte avec VB [ par pedro ]
Hello tout le monde .Je recherche les sources d'un programme qui permet de lire un fichier texte .Les données lu dans ce fichier doivent pouvoir etre
Datagrid [ par Christophe ]
Lorsque je saisie un texte dans un TextBox avec un retour chariot (touche ENTREE), et qu'ensuite je le copie dans un datagrid.A la place du retour cha
|
Derniers Blogs
[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|