[R] Filtrer les lignes d'un tableau

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Filtrer les lignes d'un tableau

#21

Message par pierrotm777 »

Tlem a écrit :Oui, c'est normal, car dans votre fonction (et donc dans la mienne) aucun traitement n'est effectué dans les autres cas.

Pourriez-vous définir exactement le(s) traitement(s) dont vous auriez besoin ?
Devez-vous ne garder que les lignes du choix du combo et renvoyer le tableau ainsi filtré ?

Bonjour Tlem,

Oui c'est exactement cela , en fonction du combo ,high , medium , low (all fonctionne déjà !) , je ne traite ET ne garde que les lignes comportant ma sélection.

J'avais réalisé cette fonction avec les lignes :

Code : Tout sélectionner

        ;mise en miniscule de $filter pour test avec $level3 ,impossible si MIN MAJ
        If $Filter[1] = "ALL" Then $Filter[1] = "all"
        If $Filter[1] = "HIGH" Then $Filter[1] = "high"
        If $Filter[1] = "MEDIUM" Then $Filter[1] = "medium"
        If $Filter[1] = "LOW" Then $Filter[1] = "low"

        If StringInStr($aRadars3[$k], $Filter[1]) Then;Test sur le filtrage si autre que ALL SETPOINTS
            $Var = StringSplit($aRadars3[$k], ',')

            $Longitude3 = $Var[2]
            $Latitude3 = $Var[1]
            $TypeRadar3 = $Var[3]

            $Var2 = StringSplit($Var[4], ' ')
            $Level3 = $Var2[2]

            $aRadars3[$k] = $Longitude3 & ',' & $Latitude3 & ',TRAPSTER,' & $TypeRadar3 & ',' & $Level3 & ','

mais de temps à autre certaines mauvaises lignes sont prises en compte , ET surtout les lignes non traitées restent deans le fichier final .
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Filtrer les lignes d'un tableau

#22

Message par Tlem »

Je n'ai pas testé, mais à première vue il n'y à pas d'erreur.
Vous me direz si ça fonctionne. :mrgreen:
► Afficher le texte_DoIt3
Edit : En regardant de plus près votre code, je vois que pour les fonctions _DoIt, vous faites ceci :
1 - Lancement de la fonction avec comme argument le tableau à traiter.
2 - Traitement dans le tableau
3 - Suppression de l'élément 0 du tableau.
4 - Renvois du tableau traité
5 - Transformation du tableau en chaîne.

Pourquoi ne pas tout simplement traiter le tableau en chaîne comme je l'ai fait pour _DoIt3 (dans votre cas il faudrait remplacer "|" par @CRLF) et renvoyer directement la chaîne toute prête. :)
Cela permettrait d'accéléré le traitement. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Filtrer les lignes d'un tableau

#23

Message par pierrotm777 »

Bonjour Tlem,
Merci encore une fois de votre aide .

J'ai du modifier la variable $i par $k car tel quel cela ne marchait pas .
Une fois cette modification faite, le filtre ne marchait pas bien .

J'ai donc plutôt fait le test par rapport à $level3 (2eme partie du 4eme champ)

ce qui me donne :

Code : Tout sélectionner

Func _DoIt3($aRadars3, $Level3 )
    Local $k, $Var, $Var2, $Longitude3, $Latitude3, $Vitesse3, $sRadar3

    For $k = 1 To $aRadars3[0]
        If $aRadars3[$k] <> "" And Not StringIsSpace($aRadars3[$k]) Then ; Si la chaine n'est pas vide ou que des espaces.

            $Var = StringSplit($aRadars3[$k], ',') ; Split de la chaine pour traitement.

            ; Début de traitement
            $Longitude3 = $Var[2]
            $Latitude3 = $Var[1]
            $TypeRadar3 = $Var[3]
       
            $Var2 = StringSplit($Var[4],' ')
            $Level3 = $Var2[2]
            ; Fin de traitement

            Switch $setuptrapsterFilter ; Utilisation de la commande switch.
                Case "HIGH CONFIDENCE" ; Si le choix du combo est ...
                    If $level3 = "high" Then ; On sélectionne seulement les chaines avec "high"
                        $sRadar3 = $sRadar3 & "|" & $Longitude3 & ',' & $Latitude3 & ',TRAPSTER,' & $TypeRadar3 & ',' & $Level3 & ','
                    EndIf
                   
                Case "MEDIUM CONFIDENCE" ; Si le choix du combo est ...
                    If $level3 = "medium"  Then ; On sélectionne seulement les chaines avec "medium"
                        $sRadar3 = $sRadar3 & "|" & $Longitude3 & ',' & $Latitude3 & ',TRAPSTER,' & $TypeRadar3 & ',' & $Level3 & ','
                    EndIf
           
                Case "LOW CONFIDENCE" ; Si le choix du combo est ...
                    If $level3 = "low" Then ; On sélectionne seulement les chaines avec "low"
                        $sRadar3 = $sRadar3 & "|" & $Longitude3 & ',' & $Latitude3 & ',TRAPSTER,' & $TypeRadar3 & ',' & $Level3 & ','
                    EndIf
               
                Case Else ; Sinon ...
                    $sRadar3 = $sRadar3 & "|" & $Longitude3 & ',' & $Latitude3 & ',TRAPSTER,' & $TypeRadar3 & ',' & $Level3 & ','

            EndSwitch
        EndIf   
    Next
   
    $sRadar3 = StringTrimLeft($sRadar3, 1) ; Permet de supprimer le caractère "|" de la première boucle.
    $aRadars3 = StringSplit($sRadar3, "|") ; On remplace le tableau $aRadars3 par les nouvelles valeurs.
    _ArrayDelete($aRadars3, 0) ; On supprime le nombre d'élément du tableau
   
    Return $aRadars3
EndFunc   ;==>_DoIt3

Désolé mais je ne comprend pas bien ce que vous me proposez de faire pour accélérer mes boucles .

Pouvez vous me donner un exemple ?

Dans un autre ordre d'idée je voudrais effacer la première ligne d'un fichier à traiter :

exemple de mon format:

Code : Tout sélectionner

X,Y,TYPE,SPEED,DIRTYPE,DIRECTION
-4.686443,48.494891,5,0,0,0
-4.678124,48.490313,5,0,0,0
-4.675299,48.565418,5,0,0,0
-4.641619,48.376346,5,0,0,0
-4.621839,48.382675,5,0,0,0
-4.619771,48.437929,5,0,0,0
-4.609389,48.381809,5,0,0,0
-4.575684,48.385673,5,0,0,0
-4.574177,48.518223,5,0,0,0
Je pensais à ces lignes mais ça ne marche pas :

Code : Tout sélectionner

Func _DoItSPD($aRadars, $TypeRadar)
    Local $i, $Var, $Var2, $Longitude, $Latitude, $Vitesse
    For $i = 1 To $aRadars[0]
        
        [color=#FF0000]If Not StringInStr($aRadars[$i], "X,Y,TYPE,SPEED,DIRTYPE,DIRECTION") Then ; On ne sélectionne pas si X,Y,TYPE,SPEED,DIRTYPE,DIRECTION
        EndIf[/color]       
        $Var = StringSplit($aRadars[$i], ",")
        $Longitude = $Var[1]
        $Latitude = $Var[2]
        $TypeRadar = $Var[3]
        $Vitesse = $Var[4]

        If $TypeRadar = "1" Then $TypeRadar = "SPEED_CAMERA"
        If $TypeRadar = "2" Then $TypeRadar = "RED_LIGHT_CAMERA"
        If $TypeRadar = "5" Then $TypeRadar = "SPEED_TRAP"

        $aRadars[$i] = $Latitude & ',' & $Longitude & ',SPEEDCAMPOI,' & $TypeRadar & ',' & 'high,'

    Next

    _ArrayDelete($aRadars, 0) ; On supprime le nombre d'élément du tableau
    Return $aRadars
EndFunc   ;==>_DoItSPD
Merci
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Filtrer les lignes d'un tableau

#24

Message par Tlem »

Pour améliorer votre code, voici ce que je vous propose :
► Afficher le texte
Pour votre deuxième question, puisque vous voulez systématiquement suprimer la première ligne, vous n'avez qu'à commencer la lecture du tableau à la deuxième ligne. ;)

Code : Tout sélectionner

For $i = 2 To $aRadars[0]
Si vous n'êtes pas sur que cette ligne sera toujours là, vous pouvez aussi récupérer les 5 premiers caractères de la ligne, et vérifier si c'est un nombre à virgule .
Pourquoi les 5 premiers caractères :
Tout simplement parce que ça peut être un nombre positif ou négatif.
Donc si c'est un négatif alors le premier caractère sera "-" sinon se sera un nombre.
Ensuite la partie entière peut être de 1 ou 2 nombres.
Après, on compte aussi le symbole de la décimale, et pour la partie décimale, un seul nombre suffit (sur les 6).
Cela donne, par exemple : -17,1 ou -1,71 ou 17,15 ou 1,715 qui seront toujours des nombres à virgule de 5 caractères. 8)

la fonction StringIsFloat vous permettra d'évaluer la chaîne récupérée et devrait vous renvoyer 1 si c'est bien un nombre à virgule.
Il aurait été possible de décomposer la ligne du tableau par un StringSplit puis de tester l'élément 1, mais je trouve plus rapide la première méthode.
Ce qui donnerait :

Code : Tout sélectionner

If StringIsFloat(StringLeft($aRadars[$i], 5)) Then
    ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Filtrer les lignes d'un tableau

#25

Message par pierrotm777 »

La fonction "For $i = 2 To $aRadars[0]" me semblait une bonne idée car ce
sera toujours la première ligne à effacer mais elle ne semble pas fonctionner .

En effet , je retrouve toujours cette ligne dans le fichier final .
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Filtrer les lignes d'un tableau

#26

Message par Tlem »

Oui parce que vous travaillez encore sur le tableau.
Dans ce cas si vous ne faites aucune modification dans la fonction (traitement par chaine comme je vous ai préconisé), supprimez deux fois la ligne 0 à la fin de votre fonction (la première supprimera le nombre d'éléments, la seconde la fameuse ligne) :

Code : Tout sélectionner

_ArrayDelete($aRadars, 0)
_ArrayDelete($aRadars, 0)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Filtrer les lignes d'un tableau

#27

Message par pierrotm777 »

Merci beaucoup,
Mon code n'est pas parfait, loin s'en faut , mais il tourne comme je le veux,
à quelques détail prés .

Merci encore .
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Filtrer les lignes d'un tableau

#28

Message par Tlem »

Alors un petit [R] dans le titre de votre 1er message serait le bienvenu.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre