Page 1 sur 2

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

Posté : lun. 28 mai 2012 14:40
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

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

Posté : lun. 28 mai 2012 14:46
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:

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

Posté : lun. 28 mai 2012 23:47
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. ;)

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

Posté : sam. 02 juin 2012 21:42
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

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

Posté : dim. 03 juin 2012 00:13
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 ?

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

Posté : dim. 03 juin 2012 00:58
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:

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

Posté : dim. 03 juin 2012 10:19
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. ;)

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

Posté : dim. 03 juin 2012 19:23
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...)

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

Posté : sam. 09 juin 2012 02:06
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. ;)

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

Posté : mer. 07 nov. 2012 23:56
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:

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

Posté : jeu. 08 nov. 2012 01:16
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. ^^

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

Posté : jeu. 08 nov. 2012 09:34
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

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

Posté : jeu. 08 nov. 2012 11:37
par Tlem
Et donc, quelles sont tes revendications ?

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

Posté : jeu. 08 nov. 2012 15:51
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:

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

Posté : mer. 14 nov. 2012 00:18
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

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

Posté : ven. 16 nov. 2012 23:06
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

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

Posté : sam. 17 nov. 2012 00:59
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 ;))).

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

Posté : dim. 18 nov. 2012 22:57
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 ^^'

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

Posté : lun. 19 nov. 2012 00:32
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:

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

Posté : lun. 19 nov. 2012 01:18
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