Tri alphabétique

nick_2428 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  2. nick_2428 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
     
    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
  3. nick_2428 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
  4. nick_2428 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
    3. nick_2428 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
       
      [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
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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