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

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#1

Message par mikell »

Bonjour,
Suite à ce post du mois dernier
http://www.autoitscript.fr/forum/viewto ... =20&t=9725
où la demande était :
" Je suis à la recherche d'une fonction qui permet de supprimer les ligne blanches d'un array existant avec 1 ou plusieurs colonnes, détection automatique. "
J'avais proposé une solution variante de celle proposée dans ce post du forum US : remove-empty-rows-in-2d-array

Mais depuis, confronté au même problème, j'ai écrit cette petite fonction très simple qui est ~ 8 fois plus rapide ( test fait sur une array[4600][5] ), détecte automatiquement si l'array est 1D ou 2D, et qui est suffisamment souple pour pouvoir être facilement adaptée à d'autres conditions de suppression de lignes dans une array
► Afficher le texte
" 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
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

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

#2

Message par blacksoul305 »

Ah, pas bête. Je pense que je vais ranger cette fonction quelque part.

Sinon, pour la variable "$fired", ça me fait penser à ça ! :lol:
Étudiant en 2ème année de Licence Informatique.
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

#3

Message par Tlem »

Bonsoir mikell.
Perso j'utilisais les fonctions de cet UDF en faisant un _Array2DToString puis un _StringToArray2D avec les bonnes options.

Code : Tout sélectionner

Local $sArray1 = _Array2DToString($aArrayTest, "", "", 1)
Local $aArray1 = _StringToArray2D($sArray1)
Bien que cette solution soit à peine un peut plus lente que la votre (environ 4 secondes d'écart pour un tableau de 100000 X 10 et quelques dixièmes de seconde pour des tableaux plus raisonnables), c'était surtout une solution détournée pour ne pas créer une fonction supplémentaire. :?

Maintenant, pourquoi ne pas rajouter votre fonction à l'UDF ArrayEx. ;)
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

#4

Message par mikell »

Tlem a écrit :Maintenant, pourquoi ne pas rajouter votre fonction à l'UDF ArrayEx. ;)
Que pensez-vous de cette amélioration
(je me suis permis une coloration autoit pour une meilleure lisibilité)
► Afficher le texte
Modifié en dernier par mikell le dim. 03 juin 2012 19:21, modifié 1 fois.
" 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

#5

Message par Tlem »

Pas mal.
Manque juste une bonne identation et une entête un peut plus standard.
Et un truc qui me tarabuste, c'est pourquoi $str_col est la seule variable à ne pas bénéficier du tirait vers le bas en début de variable ?
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

#6

Message par mikell »

Tlem a écrit :Et un truc qui me tarabuste, c'est pourquoi $str_col est la seule variable à ne pas bénéficier du tirait vers le bas en début de variable ?
Qu'est-ce que j'en sais... peut-être parce que ce tiret existe déjà dans la variable ? ou qu'à un moment chaud, je me suis dit "salope de variable, tu me fais des soucis, pisque c'est comme ça pas de tiret, na "
Argh Image
Le boss et son univers impitoyable Image
Je corrigerai donc cet indécent nom de variable... elle va pas l'indentation ?
Au fait vous l'avez testé ce code ?
Et l'en-tête il le faut en angliche je parie :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

#7

Message par Tlem »

En ce moment, mes activités privées me demande énormément de temps, donc je ne peut être présent et actif comme je le souhaiterais.
Je testerais la fonction un peut plus tard, mais je ne doute aucunement de vos capacités. ;)
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

#8

Message par mikell »

Voilà, j'ai mis aux normes et édité dans le post précédent :mrgreen:
Tu peux en disposer à ton aise (enfin bon, peut-être un petit crash-test d'abord, ça serait pas mal...)
" 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

#9

Message par Tlem »

mikell a écrit :Tu peux en disposer à ton aise
Voilà qui est fait. J'ai amélioré, renommé et ajouté la fonction dans l'UDF ArrayEx.au3.

J'ai passé un bon moment pour le crash test et il me semble que c'est bon (ceci dit, plusieurs avis serait appréciable).
Je te laisse jeter un œil dés que tu le pourra. ;)
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

#10

Message par mikell »

Hum ... "amélioré" ça se discute
Tu as supprimé la possibilité de faire une recherche sélective par colonne dans une array 2D, et tu imposes le point-virgule comme délimiteur alors que je préférais laisser le choix (avec le "|" par défaut qui est conventionnel)
Un détail : "Tlem adding conventional shaping of the function" ça d'accord, mais pour le reste tu exagères :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

#11

Message par Tlem »

mikell a écrit :Hum ... "amélioré" ça se discute
Tout est discutable. :mrgreen:
mikell a écrit :Tu as supprimé la possibilité de faire une recherche sélective par colonne dans une array 2D
Ben, j'en voyais pas l'utilité puisque le but primaire était la suppression de lignes vides amélioré en ligne contenant une ou plusieurs valeurs ...
mikell a écrit :tu imposes le point-virgule comme délimiteur alors que je préférais laisser le choix (avec le "|" par défaut qui est conventionnel)
Beaucoup d'UDFs utilisent le point virgule pour des patterns à valeurs multiples. Il n'y à rien d'exceptionnel ici !
mikell a écrit :Un détail : "Tlem adding conventional shaping of the function" ça d'accord, mais pour le reste tu exagères :mrgreen:
Ha ! Je ne m'attribue pas grand chose pourtant, malgré la grosse différence entre les deux fonctions. ^^
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

#12

Message par mikell »

La grosse différence entre les deux fonctions tient essentiellement dans les suppressions d'options ^^
Y avait eu une évolution depuis le but primaire, comme l'indiquent les exemples de mon en-tête
Par exemple, si on veut supprimer seulement les lignes où la string à rechercher figure uniquement dans une seule colonne en particulier
Idem, dans la plupart des fctns du fichier d'aide le "| " est utilisé comme délimiteur par défaut, et il existe un Opt("GUIDataSeparatorChar") pour que l'utilisateur puisse en changer, c'est cette possibilité de choix qu'offrait la fctn initiale
" 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

#13

Message par Tlem »

Et donc, quelles sont tes revendications ?
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

#14

Message par mikell »

Comme tu avais dit
Tlem a écrit :Je te laisse jeter un œil dés que tu le pourra. ;)
j'ai jeté un oeil alors voilà :mrgreen:
Simplement je ne reconnais plus la fonction de mon post #2, le nom a changé, les options que j'y avais introduites pour donner un max de souplesse et de polyvalence ont disparu, il n'en reste que l'idée
Telle qu'elle figure maintenant dans l'UDF, cette fctn édulcorée ne me satisfait (personnellement...) pas mais comme j'ai dit
mikell a écrit :Tu peux en disposer à ton aise
je ne m'autorise donc aucune revendication :wink:
" 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

#15

Message par Tlem »

Bonsoir Michel,
J'ai été "un peut contrarié" sur tes remarques et donc parce que c'est toi, j'ai fait l'effort de rajouter cette fameuse option de recherche par colonne (sans passer par une fonction interne) bien qu'actuellement je n'en vois pas l'utilité. Mais qui peut le plus, peut le moins et comme cela ne rajoute pas une trop grosse complexité de compréhension, pourquoi s'en passer après tout.

En ce qui concerne le séparateur, après moultes recherches, je n'ai trouvé aucune référence sur le fait que le "|" soit conventionnel. Il l'est sur des valeurs de sortie, mais pas sur des paramètres d'entrée à valeurs multiples.
En fouillant les includes, on retrouve bien des points virgule et des virgules, mais je n'ai pas trouvé de fonction avec des paramètres multiples en entrée qui utilise le "|" comme séparateur (mais bon, j'ai peut être mal cherché). :mrgreen:

Je te met ci-dessous la fonction modifiée et attend tes commentaires avant de la mettre à jour dans l'UDF.
► Afficher le texte
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

#16

Message par mikell »

Je n'ai pas encore eu le temps de bien regarder le code et te répondrai donc plus tard mais en attendant
Tlem a écrit :j'ai fait l'effort de rajouter cette fameuse option de recherche par colonne (sans passer par une fonction interne) bien qu'actuellement je n'en vois pas l'utilité
C'est dommage que tu n'en voies pas l'utilité, parce que bien tenir compte de chaque cellule de chaque colonne t'aurait permis d'éviter que ta fonction _Array2DToHtml soit buggée
Teste _Array2DToHtml en laissant dans l'array une cellule vide ($array[0][2] par exemple) et regarde le résultat : la cellule vide est zappée et les autres cellules de la ligne sont décalées (elles changent de colonne) j'ai eu la blague ce we avec une array de compta où la 1ère cellule (date) reste vide si la date ne change pas par rapport à la ligne précédente, et je te dis pas le fourbi à la sortie :mrgreen:


Edit
Je me suis arrêté au tout 1er test (_ArrayDeleteLines($array) : tous les params par défaut) qui n'est pas concluant
Edit 2
J'aurais dû tester l'ancienne version aussi d'ailleurs ^^
► Afficher le texte
" 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

#17

Message par Tlem »

Effectivement, je m'était tellement concentré sur la recherche par colonne, que j'en avait oublié la fonction première (supprimer les lignes vides !).

J'ai donc rectifier le tir en modifiant légèrement le code et en effectuant plusieurs tests divers (sans doute pas assez, mais pas mal quand même). Lors de ces tests, je me suis rendu compte que ta fonction plantait dans certains cas et ne renvoyait pas le même nombre d'éléments que ma fonction (ou alors j'ai l'ai mal paramétré :mrgreen:). Ce qui m'a permit de déceler un problème potentiel dans ma fonction aussi puisqu'elle est basée sur le même principe.
► Afficher le texte
Malgré la même modification que sur ma fonction pour le retour de tableau vide, cela n'a pas changé que les résultats n'étaient pas identiques (en dehors des lignes vide qui eux fonctionnent très bien sur les deux fonctions (maintenant ;))).
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

#18

Message par mikell »

Hé oui, la moralité c'est que personne n'est infaillible :mrgreen:
J'avais en effet moi aussi une bonne grosse erreur de code

Ta fonction, si tu rajoutais juste la possibilité de choisir le séparateur, elle serait nickel
Manque juste un peu d'optimisation (la mienne aussi d'ailleurs) et bien sûr les crash-tests d'usage que je n'ai pas encore faits
Heu note quand même que la mienne est un poil plus rapide (~ 60 ms) :P
► Afficher le textegros gros test
Edit
crash-tests en cours Image
J'ai édité le code de test, ta fonction se met en "erreur autoit" sur une recherche multiple et plante sur une recherche de cellule vide par colonne (ou alors je l'ai mal paramétrée :mrgreen: )

Edit2
Apparemment dans ta fonction la recherche multiple est le seul souci... (test réédité)
J'ai corrigé ma fonction mais je ne sais pas encore comment modifier la tienne
Reste à brain-stormiser la gestion d'erreur ^^'
" 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

#19

Message par Tlem »

Trop cool ce petit jeu. :lol:
Alors, voici une énième version qui passe tous tes tests :
► Afficher le texte
Bon, elle est environ 4 fois plus lente, donc je risque peut être d'adopter ta version, mais avant il faudra que tu corrige un autre bug sur ta version. Essaie _ArrayDeleteRows($aArray1, "2", 55) sur un tableau de 500*50, ou tout simplement refait ce test sur un tableau 1D. ;)

Edit :
D'ailleurs, cette dernière version m'a inspiré une nouvelle approche, car ma fonction sur du 1D est 2X plus rapide, donc je pense être parti sur une mauvaise approche en ce qui concerne le 2D.
Dès que j'en aurais le temps, je t'en ferait part. ;)

Et puis, je me suis rendu compte d'un autre problème concernant le code que j'ai rajouté en cas ou toutes les valeurs serait supprimées.
Je faisait :

Code : Tout sélectionner

            If UBound($avArray) - $fired < 1 Then
                ReDim $aArrayTmp[1]
            Else
                ReDim $aArrayTmp[UBound($avArray) - $fired]
            EndIf
alors qu'il faut faire :

Code : Tout sélectionner

            If $iUBound - $fired < 1 Then
                Dim $avArray[1]
            Else
                ReDim $avArray[$iUBound - $fired]
            EndIf
: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

#20

Message par mikell »

Tlem a écrit : il faudra que tu corrige un autre bug sur ta version. Essaie _ArrayDeleteRows($aArray1, "2", 55) sur un tableau de 500*50, ou tout simplement refait ce test sur un tableau 1D.
Heu je vois pas le problème :shock:
Ton 55 c'est un index de colonne, donc ce param est simplement ignoré dans le traitement d'une array 1D, et 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
Tu préfèrerais que je mette un SetError ?
► Afficher le texteexemple avec array 1D
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre