Tableaux de donnéesSalut,
Je souhaite comparer plus de deux tables dans JMP afin de vérifier la présence d'une colonne commune à toutes les tables. Je souhaite renvoyer 1 si les valeurs de cette colonne sont présentes dans chaque table, sinon 0. Je parviens à le faire pour certaines tables prédéfinies à l'aide d'un script JSL qui ajoute une colonne supplémentaire à chaque table et renvoie 0 ou 1.
Je souhaite que ce script soit générique afin de ne pas avoir à prédéfinir le nom des tables. Il devrait me demander, à chaque exécution, quelles tables je souhaite comparer.
Ensuite, je souhaite également que ce script me permette de sélectionner la colonne à comparer.
Actuellement, j'utilise ce script
// Get references to the three tables
dt1 = Data Table("Untitled 9");
dt2 = Data Table("Untitled 10");
dt3 = Data Table("Untitled 11");
// Extract ID values from each table
ids1 = dt1:ID << Get Values;
ids2 = dt2:ID << Get Values;
ids3 = dt3:ID << Get Values;
// Find common IDs manually
commonIDs = {};
For(i = 1, i <= N Items(ids1), i++,
If(Contains(ids2, ids1[i]) & Contains(ids3, ids1[i]),
Insert Into(commonIDs, ids1[i])
)
);
// Function to add indicator column
AddIndicatorColumn = Function({dt},
dt << New Column("PresentInAll",
Numeric,
Formula(If(Contains(commonIDs, :ID), 1, 0))
)
);
// Apply to all tables
AddIndicatorColumn(dt1);
AddIndicatorColumn(dt2);
AddIndicatorColumn(dt3);
Modification (jthi) : ajout de la mise en forme JSL
Sélection de trois tables : Untitled 9, Untitled 10 et Untitled 11, la colonne de comparaison étant « ID ».
Aidez-moi s'il vous plaît, s'il vous plaît.
Merci

Automatisation et scriptageAccès aux donnéesRe: Tableaux de donnéesCombien de lignes et de valeurs uniques contiennent vos tables ? Cela peut influencer la manière de procéder pour éviter les problèmes de performance.
Re: Tableaux de donnéesQuoi qu'il en soit, vous pouvez créer l'interface utilisateur à l'aide de la liste « Obtenir une table de données » et de listes déroulantes. Voici une version simplifiée pour vous aider à démarrer.
Names Default To Here(1);
dts = Get Data Table List();
If(N Items(dts) < 2,
Throw("Not enough tables open");
);
run_expr = Expr(
Show(lb_tables << get selected, lb_columns << get selected);
);
tables = dts << get name;
nw = New Window("",
H List Box(
Panel Box("Select tables",
lb_tables = List Box(tables,
<< Set Function(Function({this},
sel = this << get selected;
If(N Items(sel) < 1,
return(0);
);
cols = Datatable(sel[1]) << Get Column Names("String");
lb_columns << Set Items(cols);
))
),
),
Panel Box("Pick Column",
lb_columns = List Box({}, << Set Max Selected(1))
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK",
run_expr
),
Button Box("Cancel",
nw << close window;
)
)
)
)
);
Write();
Re: Tableaux de donnéesVoici un extrait de JSL plus étoffé qui reprend le JSL de Jarmo et le développe pour vous donner les résultats que vous présentez dans votre discussion initiale.
Il utilise des tableaux associatifs pour trouver l'intersection des noms de colonnes qui apparaissent dans les 3 tables, puis également des valeurs qui apparaissent dans la colonne sélectionnée.
Elle utilise également la plateforme de mise à jour pour réintégrer les résultats dans les trois tables d'origine. Cette méthode devrait s'avérer très efficace, même pour des tables de données très volumineuses.

Names Default To Here( 1 );
dts = Get Data Table List();
If( N Items( dts ) < 2,
Throw( "Not enough tables open" )
);
tables = dts << get name;
// Create the table and column selection window
nw = New Window( "",
H List Box(
// Define the Table selection box
Panel Box( "Select tables",
lb_tables = List Box(
tables,
maxselected( 3 ),
<
<SET function="">
0, lb_columns << Set Items( cols ); pickPBox << visibility( "Visible" ); ); ); ) ) ), ), // Define the column selection box pickPBox = Panel Box( "Pick Column", lb_columns = List Box( {}, Max Selected( 1 ), <
<SET function=""></SET>
</SET>
<BR />