Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer de nouvelle table ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Scénario : besoin d'ajouter des fichiers de données d'enquête quotidiens (qui incluent tous les jours précédents) à une table principale avec uniquement des enregistrements d'ID de répondant non dupliqués et sans créer de nouvelle table (parce que je ne veux pas perdre les lignes sélectionnées dans la table principale qui sont caché ou exclu
Deux tentatives :
La concaténation conserve la table principale mais ramène tous les enregistrements
La jointure n'apporte que les nouveaux enregistrements mais crée une nouvelle table afin que les caractéristiques des lignes (masquer, exclure) soient perdues
Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Excellent!!!
Ce qui m'a rendu confus, c'est cette ligne :
Parse( "Col Min( Row(), :Name(\!"" || Concat Items( dt << get column names( string ), "\!"), :Name(\!"" ) || "\ !"))" );
Je ne pouvais pas comprendre ce que faisait la "Row ()" dans le premier argument.
Merci beaucoup.
Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Salut Martine,
Vous avez raison.Ces lignes font exactement ce que vous avez déduit.J'ai ajouté quelques commentaires pour aider à le rendre plus clair pour les autres.
Je suis content que vous le trouviez utile!
Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Donc je pense que j'ai compris.La ligne 1 a produit une chaîne "Col Min( Row(), :name, :age, :sex, :height, :weight )" qui sera utilisée dans (2) pour déterminer le numéro de ligne d'une ligne précédente où toutes les colonnes correspondent .Et, 2 ajoutera le numéro de ligne de la ligne dupliquée à un tableau "doublons".
C'est assez malin.Je me demande ce qui se passe quand il y a des triplicats.Conservera-t-il toujours la première instance et supprimera-t-il la deuxième et la troisième ?Je vais devoir l'essayer.
Merci robot !
Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Bonjour Robot, pourriez-vous expliquer à quoi servent ces deux lignes ?
Merci
1. col_min = Parse( "Col Min( Row(), :Name(\!"" || Concat Items( dt << get column names( string ), "\!"), :Name(\!"" ) || "\!"))" );
2. Pour chaque ligne( If( col_min != Row(), duplicates |/= Row() ) );
Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Salut cdwhite,
J'ai écrit un script il y a quelque temps qui peut aider.Le script ci-dessous supprimera les lignes en double tout en préservant la table de données d'origine, y compris les formules et les états des lignes.L'utilisation de la fonction Concaténer suivie de ce script peut résoudre votre problème.
Noms par défaut à ici( 1 );
// Créer une table de données et de nouvelles données.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt <
dt2 = dt << Subset( (Lignes sélectionnées), Nom de la table de sortie( "Nouvelles données" ) );
dt << Effacer Sélectionner ;
dt2 << Ajouter des lignes ( {:name = "PETER", :age = 14, :sex = "M", :height = 61, :weight = 124} );
// Définissez aléatoirement des états de ligne dans les données d'origine.
dt << Sélectionner au hasard (10) << Masquer << Exclure << Effacer la sélection ;
// Ajouter de nouvelles données.
dt << Concaténer( dt2, Ajouter à la première table );
Fermer( dt2, Pas d'enregistrement );
// Supprime les lignes en double.
dt = table de données actuelle();
col_min = Parse( "Col Min( Row(), :Name(\!"" || Concat Items( dt << get column names( string ), "\!"), :Name(\!"" ) || "\!"))" ); // Crée une expression JSL pour déterminer le nombre de lignes minimum par toutes les autres colonnes.
doublons = [] ; // Crée une matrice pour stocker les lignes en double.
For Each Row( If( col_min != Row(), duplicates |/= Row() ) ); // Compare chaque ligne à l'expression "col_min" ci-dessus.Si la ligne actuelle ne correspond pas à la ligne minimale de toutes les autres colonnes, cette ligne sera ajoutée à la matrice "doublons".
dt << supprimer les lignes ( doublons ); // Supprime les doublons.
nn = N Lignes( doublons );
Nouvelle fenêtre( "Supprimer les lignes en double", <Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?
J'ai essayé d'utiliser l'option de mise à jour de la table principale, mais cela crée toujours une nouvelle table.
Tableau de données ( "Original" ) << Rejoindre (
Avec ( Tableau de données ( "Nouvelles données" ) ) ,
Mise à jour ,
Par colonnes correspondantes ( : ID de colonne = : ID de colonne ) ,
Déposez des multiples ( 1 , 1 ) ,
Nom ( "Inclure les non-correspondances" )( 0 , 1 ) ,
Conserver l'ordre de la table principale ( 1 )
);

Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Lorsque vous effectuez une jointure, vous pouvez éviter de créer une nouvelle table en utilisant l'option "mettre à jour la table principale avec les données de la seconde table".
Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Merci.Ajout d'une nouvelle colonne désignée comme type de données d'état de ligne à la table de données d'origine, puis utilisation de la copie vers et depuis les fonctionnalités dans le menu des états de ligne (en cliquant sur la colonne d'état de ligne dans la zone de liste de colonnes à gauche, pas sur l'en-tête de colonne réel) pour copier et puis réappliquez les états de ligne après avoir rejoint.Le script pour la jointure d'ajout de lignes pour amener uniquement les nouveaux enregistrements d'un ensemble de données d'enquête (et ignorer tous les cas précédemment ajoutés) dans la table de données principale :
Table de données( "Ensemble de données principal de l'enquête" ) << Join(
With( Data Table( "Ensemble de données d'enquête secondaire" ) ),
Fusionner les colonnes du même nom,
Copiez la deuxième formule de table ( 0 ),
Supprimer l'évaluation de la formule de la table principale ( 0 ),
En faisant correspondre les colonnes ( :ResponseID = :ResponseID ),
Déposez les multiples( 0, 0 ),
Nom( "Inclure les non-correspondances" )(0, 1),
Conserver l'ordre de la table principale( 1 )
)
Après avoir joint les deux fichiers, copié/restauré les états de ligne à partir de la colonne d'état de ligne à l'aide du menu d'état de ligne.A parfaitement fonctionné.Merci!
Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Vous pouvez effectuer des opérations d'ensemble à l'aide de tableaux associatifs.Impossible de trouver un moyen astucieux d'ajouter une table à une autre.J'ai dû parcourir les données à l'aide de boucles JSL.
dt_original = Nouveau tableau ( "Original" , Ajouter des lignes ( 4 ) ,
Nouvelle colonne ( "ID de colonne" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( [ 1 , 2 , 3 , 4 ] )
) ,
Nouvelle colonne ( "Résultat" , Personnage , Nominal , Définir les valeurs ( { "un" , "b" , "c" , "d" } ) )
) ;
dt_nouveau = Nouveau tableau ( "Nouvelles données" , Ajouter des lignes ( dix ) ,
Nouvelle colonne ( "ID de colonne" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , dix ] )
) ,
Nouvelle colonne ( "Résultat" , Personnage , Nominal ,
Définir les valeurs ( { "un" , "b" , "c" , "d" , "e" , "F" , "g" , "h" , "je" , "je" } )
)
) ;
// Détermine quelles lignes sont dans la nouvelle table qui ne sont pas dans l'ancienne
un_original = tableau associatif ( colonne ( dt_original , "ID de colonne" )) ;
un nouveau = tableau associatif ( colonne ( dt_nouveau , "ID de colonne" )) ;
un nouveau << retirer ( un_original ) ;
nouvelles_lignes = un nouveau << obtenir des clés ;
// Il doit y avoir un moyen plus rapide d'ajouter une table à une autre en place
non = nrows ( dt_original ) ;
nr = articles ( nouvelles_lignes ) ;
dt_original << ajouter des lignes ( nr ) ;
pour ( je = 1 , je <= ncols ( dt_original ) , je ++,
one_col = colonne ( dt_original , je ) << obtenir le nom ;
pour ( k = 1 , k <= articles ( nouvelles_lignes ) , k ++,
m = nouvelles_lignes [ k ] ;
n = k + non ;
colonne ( dt_original , one_col )[ n ] = colonne ( dt_nouveau , one_col )[ m ] ;
) ;
) ;
Re : Ajouter des lignes non dupliquées (ID de colonne unique) à une table principale sans créer une nouvelle table ?Je trouve que joindre et concaténer des tables est un peu un art (c'est-à-dire des essais et des erreurs jusqu'à ce que j'obtienne ce que je veux vraiment).Cependant, je vous recommande de rechercher le type de colonne "états de ligne" car vous pouvez enregistrer tous vos états de ligne actuels (c'est-à-dire vos états de ligne masqués et exclus) dans une colonne que vous pouvez réappliquer au besoin à votre table.