3257_fr-FR
Comparer les rangées pour l'égalitéJ'ai 2 tables de données avec le même format de colonne, mais un nombre différent de lignes. Certains types de colonnes sont des chaînes et d'autres des nombres entiers.
Je veux écrire un script qui passe par table_1 une ligne à la fois et voir s'il existe une ligne identique dans table_2 (en fonction des éléments de colonne de la ligne).
Dois-je comparer pour la colonne d'égalité, élément par élément, ou existe-t-il un moyen rapide de comparer toute la ligne? Si cela fait une différence, je n'ai pas besoin de savoir quelle ligne de la table_2 est égale, je dois seulement savoir s'il existe une ligne avec des valeurs égales.
Merci,
FactureRe: Comparaison de lignes pour l'égalitéPour éviter de parcourir deux fois les lignes des tables A et B, vous pouvez ajouter une colonne à chaque table pour indiquer leur origine (A ou
, concaténer les deux tables en une seule, puis trier cette table combinée selon une ou deux colonnes présentant les plus grandes plages de valeurs. Parcourez ensuite la table combinée ligne par ligne à la recherche de correspondances entre chaque ligne et les lignes suivantes présentant des valeurs identiques dans ces colonnes. Si une correspondance est trouvée, mais que la colonne supplémentaire de ces lignes contient également un « A » à une position et un « B » à une autre, alors (et seulement alors) comparez toutes les autres colonnes, élément par élément. Vous n'aurez ainsi besoin de parcourir la table qu'en une seule passe (plus quelques comparaisons supplémentaires si plusieurs lignes sont presque identiques), au lieu d'effectuer l'opération complète avec une double boucle.
S'il existe un moyen de comparer une ligne entière de deux tables en une seule instruction, je ne le connais pas, mais au moins ce qui précède devrait probablement accélérer un peu les choses si vous travaillez avec des tables relativement volumineuses.Re: Comparaison de lignes pour l'égalitéMerci David,
Tu m'as donné l'idée d'une approche similaire. Pour un tableau, j'ai créé une chaîne de caractères pour chaque ligne, composée de tous les éléments de la ligne. J'ai ensuite inséré cette chaîne dans une liste. De la même manière, j'ai créé une chaîne pour chaque ligne du second tableau et j'ai vérifié si elle figurait dans la liste.
dtOld = Table de données( "oldDelta" );
dtNew = Tableau de données( "Delta" );
nr = N lignes( dtOld );
nc = N Cols( dtOld );
ancienneListe = {};
Pour (j = 1, j <= nr, j++,
vieilleChaîne = "";
Pour (k = 1, k <= nc, k++,
vieilleChaîne = vieilleChaîne || Char( Colonne( dtOld, k ) )
);
Insérer dans( vieilleListe, vieilleChaîne );
);
nr = N lignes( dtNew );
Pour (j = 1, j <= nr, j++,
nouvelleChaîne = "";
Pour (k = 1, k <= nc, k++,
nouvelleChaîne = nouvelleChaîne || Char( Colonne( dtNew, k ) )
);
Si( Contient( ancienneListe, nouvelleChaîne ),
Imprimer( j )
);
);
Message modifié par : Bill ERe : Comparaison de lignes pour l’égalitéVous pouvez également essayer de fusionner les deux tables pour en former une nouvelle. La clause « where » serait alors :
col1A = col1B
et col2A = col2B
et col3A = col3B
etc.
Le tableau résultant contiendrait les doublons. C'est assez fastidieux si vous avez beaucoup de colonnes.
Comments
There are no comments yet