Page 1 sur 1
[R] Filte sur 2 colonnes doublon dans un tableau
Posté : ven. 23 oct. 2020 16:17
par touslesmatins
Bonjour,
Je tourne en rond... voici ma problématique en espérant avoir de l'aide, merci.
J'ai des données dans un tableau qui comporte 10 colonnes.
Je cherche à obtenir des données dans un nouveau tableau sans les doublons présents sur 2 colonnes.
Le soucis c'est que je dois filtrer sur 2 colonnes différentes...
J'ai la commande _ArrayUnique($aResult,1,0,0, $ARRAYUNIQUE_AUTO )qui me filtre sur une colonne, mais j'obtiens le résultat filtré, c'est à dire tous les éléments sans doublon mais avec résultat sur 1 colonne et je n ai plus le tableau de mes 10 colonnes filtrées.... et du coup je ne peux pas refaire la même manipulation pour filtrer sur la 2e colonne...
Je dois mal m'y prendre,.... je n arrive pas à obtenir des données dans un nouveau tableau sans les doublons présents sur 2 colonnes.
merci de votre aide
Re: [..] Filte sur 2 colonnes doublon dans un tableau
Posté : ven. 23 oct. 2020 17:28
par jchd
Si les colonnes en question sont convertibles en type chaîne, je créerai une Map destinée à stocker la concaténation de ces deux colonnes, disons K. On part de la fin du tableau et si K est présente dans la Map, on efface l'élément du tableau, sinon on ajoute K à la Map.
Re: [..] Filte sur 2 colonnes doublon dans un tableau
Posté : ven. 23 oct. 2020 19:02
par walkson
Bonjour,
Peut être ce code va vous convenir ?
On repère les doublons dans les colonnes et la ligne est supprimée
Code : Tout sélectionner
#include <Array.au3>
;===================== Array avec doublons ==================================
Local $array[15][10]
For $i = 0 To 9
For $y = 0 To 14
$array[$y][$i] = $i + $y
Next
Next
$array[0][2] = $array[1][2]
$array[8][1] = $array[4][1]
$array[3][1] = $array[4][1]
$array[6][1] = $array[4][1]
$array[7][1] = "AA 128"
$array[14][1] = "AA 128"
$array[13][1] = "BB"
$array[12][1] = "CC"
$array[13][4] = $array[14][4]
_ArrayDisplay($array,"origine")
;============================================================================
Local $colonne[3] = [1,2,4];colonne à controler
For $i = 0 To UBound($colonne) - 1
$del = ""
$col = $colonne[$i]
_ArraySort($array,0,0,0,$col);trie sur colonne sélectionnée
_ArrayDisplay($array,"trié sur col " & $col)
For $y = 1 To UBound($array,1) - 1 ;on compare la ligne N à la ligne N-1
If $array[$y][$col] = $array[$y - 1][$col] Then $del &= $y - 1 & ";";on stocke les lignes en doublon
Next
$del = StringTrimRight($del,1);on supprime le ; à la fin
_ArrayDelete($array,$del)
Next
_ArrayDisplay($array,"résultat")
Re: [..] Filte sur 2 colonnes doublon dans un tableau
Posté : ven. 23 oct. 2020 19:44
par jchd
Je réalise que la question est ambigüe, ou du moins je crains d'avoir mal interprété la demande.
Soit les doublons sont déterminés colonne par colonne, soit on ne considère que les doublons dont les 2 (ou N) colonnes surveillées sont identiques.
J'envisageais la seconde option, mais Walkson penche pour la première.
Re: [..] Filte sur 2 colonnes doublon dans un tableau
Posté : ven. 23 oct. 2020 21:35
par mikell
Comme toujours, fournir un exemple concret des données de départ et du résultat attendu permettrait de résoudre le problème, et d'éviter l'habituelle collection de posts et de scripts pifométrisés qui n'auront pour commentaire qu'un "oui mais non, c'est pas ça que j'voulais dire..."

Re: [..] Filte sur 2 colonnes doublon dans un tableau
Posté : ven. 23 oct. 2020 22:22
par jchd
Mmmpffff !
Re: [..] Filte sur 2 colonnes doublon dans un tableau
Posté : sam. 24 oct. 2020 00:05
par touslesmatins
Bonjour et merci effectivement les doublons sont déterminés colonne par colonne...
je regarde .....
Re: [..] Filte sur 2 colonnes doublon dans un tableau
Posté : sam. 24 oct. 2020 00:17
par touslesmatins
Merci Mikell, c'était des doublons propre à chaque colonne...
Bravo walkson, votre réponse me convient parfaitement, je vais pouvoir continuer.... un grand merci
Re: [...] Filte sur 2 colonnes doublon dans un tableau
Posté : sam. 24 oct. 2020 10:49
par touslesmatins
Bonjour, tout en gardant la solution de @Walkson, peut on connaitre le nbre de doublons pour chaque doublon.
J'explique :
La solution de @Walkson filtre sur 2 colonnes et affiche un tableau final et c'est correct, maintenant je souhaiterais recuperer les doublons supprimés et connaitre le nombre de fois qu ils ont ete trouvé dans les 2 colonnes .
Exemple type de resultat recherché :
ligne 12 philippe trouvé 14 fois
ligne 49 foot trouvé 3 fois
c'est possible ça ?
merci
Re: [...] Filte sur 2 colonnes doublon dans un tableau
Posté : sam. 24 oct. 2020 13:04
par walkson
Bonjour,
Dans le code suivant, je ne supprime pas la ligne mais la valeur en doublon avec le choix du doublon (problème que vous n'avez pas soulevé) remplacé par 2 tirets. Les lignes où se trouvent les doublons sont enregistrées dans un array (et dans la console) sous forme
6 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | col 1> Li 4> 5
valeur 5 ligne 4 colonne 1 (à partir de 0)
Code : Tout sélectionner
#include <Array.au3>
;===================== Array avec doublons ==================================
Local $array[15][10]
For $i = 0 To 9
For $y = 0 To 14
$array[$y][$i] = $i + $y
Next
Next
$array[0][2] = $array[1][2]
$array[8][1] = $array[4][1]
$array[3][1] = $array[4][1]
$array[6][1] = $array[4][1]
$array[7][1] = "AA 128"
$array[14][1] = "AA 128"
$array[13][1] = "BB"
$array[12][1] = "CC"
$array[13][4] = $array[14][4]
_ArrayDisplay($array,"origine")
;============================================================================
Local $Sup, $array1[0][11]
Local $colonne[3] = [1,2,4];colonne à controler
For $i = 0 To UBound($colonne) - 1
Local $ligne1 = "", $ligne2 = ""
$col = $colonne[$i]
_ArraySort($array,0,0,0,$col);trie sur colonne sélectionnée
;_ArrayDisplay($array,"trié sur col " & $col)
For $y = 1 To UBound($array,1) - 1 ;on compare la ligne N à la ligne N-1
If $array[$y][$col] = $array[$y - 1][$col] Then
For $x = 0 To UBound($array,2) - 1
$ligne1 &= $array[$y - 1][$x] & " | "
$ligne2 &= $array[$y][$x] & " | "
Next
$rep = MsgBox($MB_YESNO,"Doublon sur col" & $col,$ligne1 & @CRLF & $ligne2& @CRLF & @CRLF & "Voulez vous supprimer la première ligne ?" & @CRLF & "NON supprime la deuxième ligne")
If $rep = 6 Then ;$IDYES (6)
$ligne1 = $ligne1 & "col " & $col &"> "& "Li " & $y - 1 &"> "& $array[$y - 1][$col]
$array[$y - 1][$col] = "--"
$Sup &= $ligne1 & @CRLF
Else
$ligne2 = $ligne2 & "col " & $col &"> "& "Li " & $y &"> "& $array[$y][$col]
$array[$y][$col] = "--"
$Sup &= $ligne2 & @CRLF
EndIf
EndIf
$ligne1 = ""
$ligne2 = ""
Next
Next
_ArrayDisplay($array,"résultat")
_ArrayAdd($array1,$Sup)
_ArrayDisplay($array1,"suprimé")
ConsoleWrite($Sup & @CRLF)
Re: [...] Filte sur 2 colonnes doublon dans un tableau
Posté : sam. 24 oct. 2020 13:42
par touslesmatins
Merci effectivement ce n etait pas mentionné sur ma demande, désolé j ai complété et merci pour votre réponse plus que complete

Encore une question si possible...
Est il possible de copier le résultat d'un _ArrayDisplay($array) vers une feuille excell ?
Merci pour votre aide précieuse
Re: [...] Filte sur 2 colonnes doublon dans un tableau
Posté : sam. 24 oct. 2020 13:52
par walkson
Est il possible de copier le résultat d'un _ArrayDisplay($array) vers une feuille excell ?
Oui, c'est possible. Regardez l'aide pour _Excel_RangeWrite() exemple 3
Re: [...] Filte sur 2 colonnes doublon dans un tableau
Posté : sam. 24 oct. 2020 14:17
par touslesmatins
Walkson c'est Parfait merci

Re: [R] Filte sur 2 colonnes doublon dans un tableau
Posté : sam. 24 oct. 2020 14:34
par walkson
Si le format CSV ne vous dérange pas
avec #include <File.au3>
Les résultats se superposent (et c'est plus simple

)
[edit] en fonction du choix du doublon sur la colonne 1 de l'exemple, il se produit des erreurs sur la valeur 5.
La logique (après coup) serait de choisir le doublon à conserver dans l'ensemble des multiples doublons (dans une listview par exemple)