[R] Supprimer doublons dans un Array 2D

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

[R] Supprimer doublons dans un Array 2D

#1

Message par Hugues »

Bonjour, et meilleurs voex à tous pour cette année 2017.

Voilà, j'ai un tableau de x lignes sur 13 colonnes. Je voudrais supprimer les doublons qui sont présents dans 3 colonnes.

J'utilise cette fonction mais cela ne fonctionne pas avec mon tableau car je dois faire le contrôle sur les colonnes 4, 6, 7 et 9, alors que l'exemple lui c'est toute la ligne...
#include <array.au3>

Local $aAnotherArray[5][4] = [[1, 2, 3, 4],[3, 4, 5, 6],[5, 6, 7, 8],[1, 2, 3, 4],[6, 4, 3, 2]] ; Another test array

_ArrayDisplay($aAnotherArray, "before")
Local $aUnique = _ArrayUnique2d($aAnotherArray)
_ArrayDisplay($aUnique, "after")


Func _ArrayUnique2d($aArrayIn)
    ;convert $aArrayIn to one dinensiomal array, $aTemp
    Local $aTemp[UBound($aArrayIn)]
    For $r = 0 To UBound($aArrayIn) - 1
        For $c = 0 To UBound($aArrayIn, 2) - 1
            $aTemp[$r] &= $aArrayIn[$r][$c] & "#"
        Next
        $aTemp[$r] = StringTrimRight($aTemp[$r], 1)
    Next

    $aUniq = _ArrayUnique($aTemp)

    ; Re-create multi-dimensional array
    StringReplace($aUniq[1], "#", "#")
    Local $Dim2 = @extended + 1
    Local $people[UBound($aUniq) - 1][$Dim2]

    For $r = 1 To UBound($aUniq) - 1
        $aSplit = StringSplit($aUniq[$r], "#")
        For $c = 0 To $aSplit[0] - 1
            $people[$r - 1][$c] = $aSplit[$c + 1]
        Next
    Next
    Return $people
EndFunc   ;==>_ArrayUnique2d
Merci par avance
Modifié en dernier par Hugues le jeu. 05 janv. 2017 10:04, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Supprimer doublons dans un Array 2D

#2

Message par mikell »

j'ai un tableau de x lignes sur 13 colonnes. Je voudrais supprimer les doublons qui sont présents dans 3 colonnes.
Je ne suis pas sûr d'avoir compris la question, tu pourrais préciser ?
Avec si possible un tout petit exemple "données de départ / résultat souhaité"
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] Supprimer doublons dans un Array 2D

#3

Message par Hugues »

Voici un exemple: Exemple

Donc, sijamais je trouve pour chaques lignes des valeurs identiques dans les colonnes 3, 5 6, 7 et 8 alors je supprime les doublons et ne garde que le premier.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: [..] Supprimer doublons dans un Array 2D

#4

Message par mdanielm »

Essaie ça:
#include <array.au3>

Global $T[][] = [ _
[504175842,"L1",62,"257881-00","03/01/2017 05:29",28,16007,"B9","fPR15_Fex",-100,"3275,02",1900], _
[504175913,"L1",62,"257881-00","03/01/2017 05:29",28,16007,"B9","fPR15_Fex",-100,"3207,91",1900], _
[504223224,"L1",62,"254802-00","03/01/2017 07:12",86,16547,"B9","fPR15_Fex",-100,"2362,31",1900], _
[504299097,"L1",62,"254802-00","03/01/2017 08:07",2, 16813,"B9","fPR15_Fex",-100,"2389,15",1900], _
[504299216,"L1",62,"254802-00","03/01/2017 08:07",2, 16813,"B9","fPR15_Fex",-100,"2241,51",1900], _
[504299386,"L1",62,"254802-00","03/01/2017 08:08",50,16817,"B9","fPR15_Fex",-100,"2509,95",1900], _
[504299504,"L1",62,"254802-00","03/01/2017 08:08",50,16817,"B9","fPR15_Fex",-100,"2402,58",1900], _
[504392942,"L1",62,"257674-00","03/01/2017 16:19",79,17499,"B9","fPR35_Fex",-100,"3248,26",1900], _
[504393151,"L1",62,"257674-00","03/01/2017 16:19",79,17499,"B9","fPR35_Fex",-100,"2214,72",1900], _
[504407493,"L1",62,"257674-00","03/01/2017 16:48",51,17619,"B9","fPR35_Fex",-100,"2322,1", 1900], _
[504407670,"L1",62,"257674-00","03/01/2017 16:48",51,17619,"B9","fPR35_Fex",-100,"2644,25",1900], _
[504407248,"L1",62,"257674-00","03/01/2017 16:49",71,17625,"B9","fPR15_Fex",-100,"6925,87",1900], _
[504407338,"L1",62,"257674-00","03/01/2017 16:49",71,17625,"B9","fPR15_Fex",-100,"4939,38",1900]]

Global $n=UBound($T,1)

; Si la ligne $i coïncide avec la ligne $j, met 0 en 1ere colonne
for $i=0 to $n-2
   if $T[$i][0] > 0 then
      for $j=$i+1 to $n-1
         if $T[$j][0] > 0 and $T[$j][3]=$T[$i][3] and $T[$j][5]=$T[$i][5] and _
            $T[$j][6]=$T[$i][6] and $T[$j][7]=$T[$i][7] and $T[$j][8]=$T[$i][8] Then
            $T[$j][0] = 0
         EndIf
      Next
   EndIf
Next
_ArrayDisplay($T)

; Supprime les lignes qui commencent par 0
$k=1 ;index où écrire
for $i=1 to $n-1 ; i=1 car la ligne i=0 reste toujours en place
   if $T[$i][0]>0 and $i>$k then
      Copie($i, $k)
      $k+=1
   EndIf
Next

redim $T[$k][12]

_ArrayDisplay($T)

;======================================================
func Copie($i, $k)
   for $j=0 to 11
      $T[$k][$j] = $T[$i][$j]
   Next
EndFunc
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Supprimer doublons dans un Array 2D

#5

Message par mikell »

ou ça

Code : Tout sélectionner

#include <Array.au3>
     
Global $aArray[][] = [ _
    [504175842,"L1",62,"257881-00","03/01/2017 05:29",28,16007,"B9","fPR15_Fex",-100,"3275,02",1900], _
    [504175913,"L1",62,"257881-00","03/01/2017 05:29",28,16007,"B9","fPR15_Fex",-100,"3207,91",1900], _
    [504223224,"L1",62,"254802-00","03/01/2017 07:12",86,16547,"B9","fPR15_Fex",-100,"2362,31",1900], _
    [504299097,"L1",62,"254802-00","03/01/2017 08:07",2, 16813,"B9","fPR15_Fex",-100,"2389,15",1900], _
    [504299216,"L1",62,"254802-00","03/01/2017 08:07",2, 16813,"B9","fPR15_Fex",-100,"2241,51",1900], _
    [504299386,"L1",62,"254802-00","03/01/2017 08:08",50,16817,"B9","fPR15_Fex",-100,"2509,95",1900], _
    [504299504,"L1",62,"254802-00","03/01/2017 08:08",50,16817,"B9","fPR15_Fex",-100,"2402,58",1900], _
    [504392942,"L1",62,"257674-00","03/01/2017 16:19",79,17499,"B9","fPR35_Fex",-100,"3248,26",1900], _
    [504393151,"L1",62,"257674-00","03/01/2017 16:19",79,17499,"B9","fPR35_Fex",-100,"2214,72",1900], _
    [504407493,"L1",62,"257674-00","03/01/2017 16:48",51,17619,"B9","fPR35_Fex",-100,"2322,1", 1900], _
    [504407670,"L1",62,"257674-00","03/01/2017 16:48",51,17619,"B9","fPR35_Fex",-100,"2644,25",1900], _
    [504407248,"L1",62,"257674-00","03/01/2017 16:49",71,17625,"B9","fPR15_Fex",-100,"6925,87",1900], _
    [504407338,"L1",62,"257674-00","03/01/2017 16:49",71,17625,"B9","fPR15_Fex",-100,"4939,38",1900]]
_ArrayDisplay($aArray)

For $i = UBound($aArray)-1 To 1 Step -1
    If $aArray[$i][3] = $aArray[$i-1][3] Then 
         If $aArray[$i][5] = $aArray[$i-1][5] and _
            $aArray[$i][6] = $aArray[$i-1][6] and _
            $aArray[$i][7] = $aArray[$i-1][7] and _
            $aArray[$i][8] = $aArray[$i-1][8] Then _ArrayDelete($aArray, $i)
    EndIf
Next
_ArrayDisplay($aArray)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: [..] Supprimer doublons dans un Array 2D

#6

Message par mdanielm »

Tu supposes donc, sans le dire:
1- Qu'il n'y a jamais plus de 2 lignes qui matchent
2- Que deux lignes qui matchent sont toujours consécutives
Bonne journée
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] Supprimer doublons dans un Array 2D

#7

Message par Hugues »

Impec :mrgreen:

Merci à vous deux
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Supprimer doublons dans un Array 2D

#8

Message par mikell »

mdanielm a écrit :Tu supposes donc, sans le dire:
1- Qu'il n'y a jamais plus de 2 lignes qui matchent
Pourquoi ? si 4 lignes matchent le code n'en garde qu'une
mdanielm a écrit :2- Que deux lignes qui matchent sont toujours consécutives
Oui, au départ j'avais mis un _ArraySort sur la colonne 3, épi je l'ai enlevé après avoir vu le xml
" 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