Tri alphabétique

Fermé
nick_2428 Messages postés 31 Date d'inscription lundi 5 novembre 2012 Statut Membre Dernière intervention 5 juillet 2015 - 10 nov. 2012 à 17:05
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 15 nov. 2012 à 08:45
Bonjour,

j'aimerais être capable d'effectuer un tri par ordre alphabétique dans mon fichier résultat avec ce code-ci. Mon tri doit se faire selon la variable MyArray(13) (liste de prénoms). J,ai bien beau chercher depuis 2-3 jours déjà, je ne trouve rien qui m,aide vraiment pour le moment. Je ne sais pas si quelqu'un peut me donner un coup de main. Tout le code est fonctionnel, il manque juste ce petit bout là pour considérer le tout comme 100% fonctionnel.

strSourceFile = "C:\...txt"
strResultat = "C:\....HTML"


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.openTextFile(strSourceFile, 1,true)
Set objResultat = objFSO.openTextFile(strResultat, 8,true)

dim Myarray (20)
objResultat.writeline "<table ALIGN=CENTER><tr><td><big><b><span><font size=60> Addresse et Téléphone </FONT></span><br><br></td></tr></table>"
x=0

Do until objTextFile.AtEndOfStream
MyArray(x) = objTextFile.ReadLine
straddresse = Mid(MyArray(1),8,2)
strtelephone = Mid(MyArray(1),11,2)

If x = 19 Then
x=0
objResultat.writeline "<table border=1 ALIGN=CENTER valign=middle cellspacing=0 cellpadding=0><tr><td align=left width=300><span><font size=5>"&" "&MyArray(13)&"</font></span></td><td align=center width=40><span><font size=5>"&straddresse&"</font></span></td><td align=center width=20><span><font size=5>"&"/"&"</font></span></td><td align=center width=40><font size=5><span>"&strtelephone&"</span></font></td></tr></table>"
Else
x=x+1
End If
Loop
objTextFile.close
objResultat.close
wscript.quit

4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
11 nov. 2012 à 16:57
Bonjour,

oeut-être une piste (je n'en suis pas l'auteur):
T est ton array
senstri ctrie dans l'ordre croissant ( de mémoire: true) ou décroissant

Sub TriaBulle(T, Optional SensTri As Boolean = True)
    Dim Test As Boolean, I&, Temp
     Do
       Test = False
       For I = LBound(T) To UBound(T) - 1
         If (T(I) > T(I + 1) And SensTri) Or (T(I) < T(I + 1) And Not SensTri) Then
           Temp = T(I)
           T(I) = T(I + 1)
           T(I + 1) = Temp
           Test = True
         End If
       Next I
     Loop Until Not Test
  End Sub


1
nick_2428 Messages postés 31 Date d'inscription lundi 5 novembre 2012 Statut Membre Dernière intervention 5 juillet 2015
11 nov. 2012 à 14:22
Personne? Est-ce que c'est possible à la base? Vers quoi je devrais chercher? Est-ce que je me suis mal exprimé et j'en deviens incompréhensible?

Toute l'aide apporté sera très apprécié. Je suis vraiment blocké à ce point.

Merci

Nick
0
nick_2428 Messages postés 31 Date d'inscription lundi 5 novembre 2012 Statut Membre Dernière intervention 5 juillet 2015
12 nov. 2012 à 01:45
Merci

Malheureusement, j'obtiens un message d'erreur sur la 1ere ligne.

Merci quand même du coup de main. Je vais continuer ma recherche.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
12 nov. 2012 à 08:45
Bonjour,

Curieux, je viens d'essayer et c'est OK ...(essai sur l'éditeur VBA Ms office)

peut-^tre parce qu'il s'agit d'une sub paramétrée avec une syntaxe particulière d'appel

le code ;
Sub Test()
tablo = Array("Pierre", "Annie", "Paul", "Jean", "Alain", "Léone")
TriaBulle tablo
End Sub

Sub TriaBulle(T, Optional SensTri As Boolean = True)
    Dim Test As Boolean, I&, Temp
     Do
       Test = False
       For I = LBound(T) To UBound(T) - 1
         If (T(I) > T(I + 1) And SensTri) Or (T(I) < T(I + 1) And Not SensTri) Then
           Temp = T(I)
           T(I) = T(I + 1)
           T(I + 1) = Temp
           Test = True
         End If
       Next I
     Loop Until Not Test
  End Sub


Je ferai un essai en Vbscript et te dirai le résultat
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
12 nov. 2012 à 09:07
Voici la version en Vbscript sans macro paramétrée et c'est OK aussi
T = Array("Pierre", "Annie", "paul", "Jean", "Alain", "Léon")
     Do
       Test = False
       For I = LBound(T) To UBound(T) - 1
         If (T(I) > T(I + 1)) Then
           Temp = T(I)
           T(I) = T(I + 1)
           T(I + 1) = Temp
           Test = True
         End If
       Next
     Loop Until Not Test
     ordre = Join(T, ", ")
     Wscript.Echo ordre
0
nick_2428 Messages postés 31 Date d'inscription lundi 5 novembre 2012 Statut Membre Dernière intervention 5 juillet 2015
13 nov. 2012 à 19:46
Merci beaucoup Michel de me donner un coup de main. C'est vraiment apprécié. Je ne travaille pas dans le milieu et je n'ai pas non plus de mentor pour m'aider. Je dois apprendre sur le tas et quelques fois ce n'est pas évident. Effectivement, ton code marche parfaitement et c'est exactement ce que je veux faire. Le seul hic que je rencontre, c'est que je n'ai aucune idée où l'insérer dans mon code pour que mon strResultat soit trié de façon alphabétique lorsque je double click sur mon fichier html (strResultat) créé par mon code. Donc en gros, j'aimerais que mon code s'effectue, puisque celui-ci isole certaines variables de mes Arrays et j'aimerais ensuite que les résultats soient triés en ordre alphabétique. J'espère m'être bien exprimé pour que tu comprennes bien ce que je veux faire.

Voici un exemple d'un de mes Arrays:

78 38 45 18 24 22 61 59 68 32
48 48 71 26 119 14 10 0 5 1 0
2003 16 5 100 0 0 0 0 99
0 0 0 0
0 0 0 0
0 0 0 0 0 1
10 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 2 219 10 6
0 0 0 0 0
0 0 2 58 116
Jacques Beauchand
70 80 83 74 86 83 7 1 5 1 0
1985 16 5 6 2 2003 1 1 1
9 1 3 0
1 0 2 0
50 49 98 1 0 108
0 108 0 0 0 8



Au total dans mon fichier, j'ai 3500 Arrays de 20 lignes chacun. La variable à trier alphabétiquement est la ligne 14 de chaque array (MyArray(13)= Nom de personnes).


strSourceFile = "C:\...txt"
strResultat = "C:\....HTML"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.openTextFile(strSourceFile, 1,true)
Set objResultat = objFSO.openTextFile(strResultat, 8,true)
dim Myarray (20)
objResultat.writeline "<table ALIGN=CENTER><tr><td><big><b><span><font size=60> Addresse et Téléphone </FONT></span><br><br></td></tr></table>"
x=0
Do until objTextFile.AtEndOfStream
MyArray(x) = objTextFile.ReadLine
straddresse = Mid(MyArray(1),8,2)
strtelephone = Mid(MyArray(1),11,2)
If x = 19 Then
x=0
objResultat.writeline "<table border=1 ALIGN=CENTER valign=middle cellspacing=0 cellpadding=0><tr><td align=left width=300><span><font size=5>"&" "&MyArray(13)&"</font></span></td><td align=center width=40><span><font size=5>"&straddresse&"</font></span></td><td align=center width=20><span><font size=5>"&"/"&"</font></span></td><td align=center width=40><font size=5><span>"&strtelephone&"</span></font></td></tr></table>"
Else
x=x+1
End If
Loop
objTextFile.close
objResultat.close
wscript.quit



APRÈS JE NE VOUS ACHALE PLUS :P !!!!! MERCI
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 14/11/2012 à 08:41
Bonjour,

Difficile de s'y retrouver dans tes explications...

tu extrais de ton HTLM une variable tableau StrResultat(3500,20)
ou as tu 3500 array de 20 données (soit 3500 strResultats) si oui comment passe tu d'un strresultat au suivant ?

as tu des risques de doublons dans les noms-prénoms ?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 14/11/2012 à 11:01
au lieu de StrResultats lire Strsourcefile....
annule mon post précédent
en fait, chaque strfiletext envoie des données dans un array dont l'indice 13 renvoie le nom, 1 l'adresse et le tél, et ces 3 données seront retranscrites dans strResuliats dans l'ordre nom, adresse,tél
C'est bien çà ?

edit: 11:00
STP, merci de mettre un fichier source en piece jointe
pour joindre une pièce
mettre le fichier sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse


Enfin, le + important:
quès aco "Achale" ? :o)
0
nick_2428 Messages postés 31 Date d'inscription lundi 5 novembre 2012 Statut Membre Dernière intervention 5 juillet 2015
Modifié par nick_2428 le 14/11/2012 à 15:09
[quote="michel_m"] en fait, chaque strfiletext envoie des données dans un array dont l'indice 13 renvoie le nom, 1 l'adresse et le tél, et ces 3 données seront retranscrites dans strResuliats dans l'ordre nom, adresse,tél. C'est bien çà ?  [/quote]  

Oui c'est exactement ça.  

Voici un échantillon de mon fichier source. Je n'ai pas pu le mettre de façon intégral, puisqu'il contient énormément d'informations personnelles. J'ai modifier le texte pour éliminer ces informations, mais dans le fichier en pièces jointes, j'ai seulement mis 6 exemples de arrays présent dans mon fichier et non les 3500 comme j'ai actuellement dans le vrai fichier source. J,espère que ça sera correcte pour les fins de l'exercise.  

https://www.cjoint.com/?0KopgZ4kYSr   

[quote="michel_m"]quès aco "Achale" ? :o)[/quote]  

Ça veut dire embêté..... Je ne vous embêterai plus ensuite :P
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 15/11/2012 à 08:03
Bonjour,
ma question: chaque strfiletext envoie des données dans un array ?
ta réponse:
Oui c'est exactement ça.
+ loin
j'ai seulement mis 6 exemples de arrays présent dans mon fichier et non les 3500

????

D'autre part, tu indiques que la présentation de ton array est vertical (ton document joint) et tu écris dans ton code
MyArray(x) = objTextFile.ReadLine

???

Bon le principe serait de boucler sur tout les arrays en créant une variable tableau de N lignes (3500) et 3 colonnes identité, adresse, téléphone
on trierait ce tableau sur l'identité ( par le nom ou le prénom ?)
on déviderait alors les 3500 lignes sous la forme du fichier text que tu as fait
mais je commence à douter....
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 15/11/2012 à 08:47
Le principe mais je renonce à comprendre comment tu extrais tes 3500 arrays
a toi de voir quel style de boucle tu veux utiliser


on boucle sur les 3500 arrays  
ReDim T_tri(2, 0)  
For cptr = 0 To 3500 ' 3500 à confirmer ou calculer ou autre style de boucle (do loop..., for each array... avec implémention de cptr avant redim preserve)  
     ReDim Preserve T_tri(2, cptr)  
     Tri(0, cptr) = arrayencours(13) 'identité  
     Tri(1, cptr) = Mid(arrayencours(1), 8, 2) 'adresse  
     Tri(2, cptr) = Mid(arrayencours(1), 11, 2) 'téléphone  
Next  


'Pour trier le tableau T_tri avec les 3500 arrays (technique des quicksort pour >1000 lignes)  

     Tablo = T_tri  
     Col = 0 'identité  
     Min = LBound(T_tri)  
     Max = UBound(T_tri)  

     'Tri rapide  
    Dim I&, J&, K&, M, Chaine  
     I = Min  
     J = Max  
     M = Tablo((Min + Max) / 2, Col)  
     While (I <= J)  
       While (Tablo(I, Col) < M And I < Max)  
         I = I + 1  
       Wend  
       While (M < Tablo(J, Col) And J > Min)  
         J = J - 1  
       Wend  
       If (I <= J) Then  
         For K = LBound(Tablo, 2) To UBound(Tablo, 2)  
           Chaine = Tablo(I, K)  
           Tablo(I, K) = Tablo(J, K)  
           Tablo(J, K) = Chaine  
         Next K  
         I = I + 1  
         J = J - 1  
       End If  
     Wend  
     If (Min < J) Then TriMulti Tablo, Col, Min, J  
     If (I < Max) Then TriMulti Tablo, Col, I, Max  
  End Sub


'écriture du fihier résultat
fin = cptr
For cptr = 0 To fin
objResultat.writeline "<table border=1 ALIGN=CENTER valign=middle cellspacing=0 cellpadding=0><tr><td align=left width=300><span><font size=5>" & " " & T_tri(0, cptr) & "</font></span></td><td align=center width=40><span><font size=5>" & T_tri(1, cptr) & "</font></span></td><td align=center width=20><span><font size=5>" & "/" & "</font></span></td><td align=center width=40><font size=5><span>" & T_tri(2, cptr) & "</span></font></td></tr></table>"
'aller à la ligne
Next

Voilà, je ne peux plus faire grand chose, hélas (eextraction des arrays mystérieuses pour moi)

Enfin Chalade: quel langue ou dialecte ?
dans mon coin, c'est plutôt "escagasser" mais c'est vulgaire ....:oD
0