[Func] Suppression conditionnelle de ligne dans array 1 - 2D

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#21

Message par Tlem »

mikell a écrit :pour une array 2D il est géré par les lignes

Code : Tout sélectionner

        Case 2 ; array 2D
            Local $cols = UBound($_array, 2)
            If $_str_col < -1 Or $_str_col > $cols - 1 Then $_str_col = -1
qui remettent ce param à la valeur par défaut s'il est supérieur au nb de colonnes
Ben le problème est que si je cherche une valeur dans une colonne, je n'ai pas forcément envie qu'il soit cherché dans toutes les colonnes. ^^
Si la colonne n'existe pas, alors la valeur ne peut être cherchée/supprimée et donc on doit retourner le tableau (ou retourner une erreur).
Ma fonction retournait les bonnes valeurs, mais en effectuant les boucles. Je vais donc rajouter ce test pour gagner du temps sur ce cas.

PS: J'avais édité mon message précédent concernant la mise à jour du tableau.

Edit : Le crash test me dit que _ArrayDeleteRows($aArray1, "|25", -1, 1) est faux dans certains cas. Parfois, la ligne avec la case vide est retournée. :shock:
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é".
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#22

Message par Tlem »

Voici ma version 5 de _ArrayDeleteLines() revue et corrigée :
► Afficher le texte
Un peut plus de 3 fois plus rapide sur du 1D (d'ailleurs il semble que _ArrayDeleteRows($aArray1, "25", -1, 1) ne fonctionne pas correctement. Peut être en rapport avec l'edit du message précédent).
A peine plus rapide sur du 2D (mais franchement l'écart n'est pas significatif). _ArrayDeleteLines($aArray1, ";25",1) supprime bien la ligne avec la case vide dans tous les cas.
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é".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#23

Message par mikell »

Tlem a écrit :_ArrayDeleteLines($aArray1, ";25",1) supprime bien la ligne avec la case vide dans tous les cas.
_ArrayDeleteRows($aArray1, "|25", -1, 1) : ce paramétrage signifie "supprime les lignes vides ou qui contiennent 25 (mode fullstring)"
Dans ton array-test $array1[501][51] où valeurs vont de 1 à 100, le 25 sera forcément fullstring donc le paramètre fullstring est inutile
Le résultat doit être le même dans ce cas que le test sans le param fullstring
Dans ce sens, ma fonction donne le résultat juste... une ligne avec une case vide ne sera supprimée que si elle contient aussi 25

Bien plus significatif et intéressant, faire _ArrayDeleteRows($aArray1, "|5", -1, 1) où là, le param fullstring a du sens (on respecte les lignes avec 15, 25 etc) et où le résultat retourné est bien exact :wink:

Mais tu soulèves une question hachement délicate :
En effet _ArrayDeleteRows($aArray1, "25") supprime les lignes qui contiennent 25, mais _ArrayDeleteRows($aArray1, "") est censé ne virer que les lignes entièrement vides
Comment paramétrer pour pouvoir lui dire "supprime les lignes qui ont au moins une case vide" tout en pouvant aussi lui dire "supprime les lignes entièrement vides mais respecte celles qui n'ont pas que des cases vides" ?
Image
La solution évidente serait d'introduire un nouveau flag dans la fonction, pour apporter cette précision et forcer le mode de recherche... :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#24

Message par Tlem »

Hummm, la logique voudrait que :
  • _ArrayDeleteRows($aArray1, "") Soit implicite pour supprimer les lignes vierge (revient à faire _ArrayDeleteRows($aArray1, "", -1, 0).
  • _ArrayDeleteRows($aArray1, "25") ou _ArrayDeleteRows($aArray1, "25" , -1, 0) supprime les lignes dont au moins une des cellules contient le nombre 25 dans son contenu (par exemple : 25, 125, 255, 1425789 etc ...).
  • _ArrayDeleteRows($aArray1, "25" , -1, 1) doit supprimer les lignes dont au moins une des cellules contient exactement le nombre 25.
  • _ArrayDeleteRows($aArray1, "|25", -1, 0) devrait supprimer toutes les lignes dont une des cellules contient les chiffres 25 (par exemple : 25, 125, 255, 1425789, etc ...) mais le paramètre 0 en conjonction avec une valeur nulle devrait indiquer les lignes vides.
  • _ArrayDeleteRows($aArray1, "|25", -1, 1) devrait se comporter comme ci-dessus mais comme les valeurs doivent sont implicite, la valeur nulle doit représenter une cellule vide.


    Ensuite rentre en jeu le paramètre Row qui détermine exactement la case à examiner. Donc :
  • _ArrayDeleteRows($aArray1, "25" , X, 0) examine la cellule X et cherche dans le contenu le nombre 25 alors que _ArrayDeleteRows($aArray1, "25" , X, 1) indique que la cellule doit contenir le nombre 25. Idem avec plusieurs nombres ou une valeur nulle.
Voilà. Je pense avoir fait le tour des possibilités. Normalement c'est le comportement de la dernière version de _ArrayDeleteLines().
Il est clair que pour quelqu'un qui veut supprimer les lignes contenant une valeur spécifique dans une cellule déterminée ainsi que les lignes vides, il faudra effectuer deux traitements. ^^
Après, vu la rapidité d'exécution, la suppression des lignes blanches pourrait être un paramètre supplémentaire, mais comme ça fonctionne dans _ArrayDeleteLines(), je ne cherche pas plus loin. :mrgreen:
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é".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#25

Message par mikell »

Bah oui quand même j'y étais arrivé :mrgreen:
En fait le plus chiant c'est les tests ^^
► Afficher le texte
Bien vu la récursivité, mais faudrait comparer les vitesses
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#26

Message par Tlem »

Salut Michel. Au niveau de la vitesse d'exécution, les temps sont sensiblement identiques sur du 2D alors que sur du 1D il y a un sacré écart. De plus _ArrayDeleteRows semble ne pas donner de bons résultats sur du 1D sur le test sans ligne avec 25 et sans ligne avec 25 et case vide (a vérifier).
Fichiers joints
_ArrayDeleteLines Vs _ArrayDeleteRows.au3
(11.78 Kio) Téléchargé 338 fois
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é".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#27

Message par mikell »

Je m'étais pris la tête sur l'ajustage du code pour l'array 2D et avais du coup zappé l'array 1D :roll:
1 seule ligne de code à modifier dans le Case 1 ;array 1D

Code : Tout sélectionner

$row = "|" & $_array[$i] & "|"
Ton comparatif montre (pour résumer) que ta fonction est plus rapide sur les opérations simples et plus lente sur les opérations complexes
Pour l'array 1D, elle est entre 2.5 et 3 fois plus rapide que la mienne
Pour la 2D, elle est légèrement plus rapide pour les opérations simples (recherche de lignes ou cases vides), mais plus c'est complexe plus c'est lent
Par exemple, _ArrayDeleteLines($aArray1, "25;17") est 2 fois plus lent que _ArrayDeleteRows($aArray1, "25|17")
AMHA c'est la récursivité puisque ça devient lent dès qu'on utilise le délimiteur
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#28

Message par Tlem »

Pour le correctif 1D, c'est tout bon. Les deux fonctions retournent les même valeurs.

En ce qui concerne mon comparatif, il montre que l'écart de temps n'est franchement pas significatif, car même pour une recherche complexe sur un trèèèèès grand tableau (recherches habituelles + 17,18,19,20,25 sur un tableau de 10000x500) les temps restent plus ou moins raisonnablement proche.
Le test sur mon PC me donne :
1,54s Vs 5,65s en faveur de _ArrayDeleteLines pour du 1D (3,66x)
311s Vs 259s en faveur de _ArrayDeleteRows pour du 2D (1,2X)

Donc franchement pas de quoi fouetter un mikell chat ... ^^

Après effectivement, il faut voir sur quel type de tableau cela est utilisé (1D ou 2D) et sur quelle type de recherche et enfin la fréquence de recherche. En fonction de ces critères, il est effectivement possible d'avoir un choix à faire, mais en l'état, elle se valent toutes les deux. ;)
En tout cas merci pour ces échanges qui on fait avancé les choses et qui ont permit d'avoir deux fonctions efficaces et normalement sans bugs. :roll:
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é".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#29

Message par mikell »

Tlem a écrit :En tout cas merci pour ces échanges
C'était un plaisir :wink:
Et merci d'avoir joué le jeu, c'est toujours intéressant d'avoir en face quelqu'un de susceptible réactif, ça vous tire vers le haut Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] Suppression conditionnelle de ligne dans array 1

#30

Message par Tlem »

+1
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