Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLJ'ai deux tables, appelons-les dt1 et dt2
Chaque table comporte une colonne, Colonne 1 dans dt1 et Colonne 2 dans dt2.
Je dois mettre à jour ou créer une table dont le contenu de la colonne 1 est mappé à celui de la colonne 2 par sélection manuelle. Les entités des colonnes étant très différentes, il est impossible d'utiliser la fonction de jointure ou de mise à jour.
Mon objectif est de créer une interface utilisateur qui permet à l'utilisateur de sélectionner ligne par ligne la correspondance du contenu dans les deux colonnes.

Automatisation et scriptsRe : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLL' option « Appliquer le mappage à partir d'une table » de la plateforme Recode serait-elle utile dans votre situation ? Si oui, elle peut être intégrée à un script.
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLSalut Jed_campbell,
Malheureusement non. Cela suppose l'existence d'une liste reliant une colonne à une autre. J'essaie concrètement de créer une telle liste.
Pour cette question, supposons que je n'ai que deux tables dt1 et dt2, chacune comportant une seule colonne (colonne 1 et colonne 2) et que je souhaite mapper une partie du contenu de la colonne 1 à celui de la colonne 2. (J'utilise « une partie du contenu » car le nombre de lignes des deux colonnes est différent.)
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLAh, quelque chose comme ça devrait fonctionner pour vous, si j'ai bien compris. Vous remplaceriez les deux premières tables par les vôtres.

Names Default To Here( 1 );
dt1 = New Table( "Table 1",
Add Rows( 4 ),
New Column( "Choice1", Character, "Nominal", Set Values( {"A", "B", "C", "D"} ) )
);
dt2 = New Table( "Table 2",
Add Rows( 5 ),
New Column( "Choice2", Character, "Nominal", Set Values( {"L", "M", "N", "O", "P"} ) )
);
dtlookup = New Table( "lookuptable",
Add Rows( 0 ),
New Column( "dt1choice", Character, "Nominal" ),
New Column( "dt2choice", Character, "Nominal" )
);
lst1 = Associative Array( dt1:Choice1 ) << get keys;
lst2 = Associative Array( dt2:Choice2 ) << get keys;
nw = New Window( "Chooser",
H List Box(
lb1 = List Box( lst1, max selected( 1 ) ),
lb2 = List Box( lst2, max selected( 1 ) ),
),
Button Box( "Make Match",
dtlookup << add rows(
{dt1choice = (lb1 << get selected)[1], dt2choice = (lb2 << get selected)[1]}
)
)
);
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLBonjour Jed_Campbell, cela devrait fonctionner en principe, mais j'obtiens l'erreur suivante lorsque j'essaie d'exécuter ce code sur des tables déjà ouvertes dt1 avec Column Choice1 et dt2 avec Column Choice2. J'utilise JMP17.
L'accès à la table de données limitée nécessite une colonne ou une variable de table de données dans l'accès ou l'évaluation de 'dt1:Choice1', dt1:Choice1/*###*/
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLJ'ai résolu le problème. Merci beaucoup pour votre aide. Ça fonctionne maintenant.
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLVoici une interface utilisateur très rapidement assemblée qui suit légèrement les plates-formes de jointure/mise à jour de table de JMP
Voir plus...
/*""" Map two columns together
Author: jthi
Creation Date: 2025-06-05
Creation JMP Version: JMP Pro 18.2.0
"""*/
Names Default To Here(1);
dt1 = New Table("Untitled", New Column("Column 1", Character, "Nominal", Set Values({"A", "B", "C"})));
dt2 = New Table("Untitled", New Column("Column 2", Character, "Nominal", Set Values({"E", "F", "G", "H"})));
nw = New Window("Matcher",
Lineup Box(N Col(3),
V List Box(
Panel Box("From - Table: " || (dt1 << get name || ", Column: " || (Column(dt1, 1) << get name)),
window:lb_from = List Box(Column(dt1, 1) << get values)
),
Panel Box("To - Table: " || (dt2 << get name || ", Column: " || (Column(dt2, 1) << get name)),
window:lb_to = List Box(Column(dt2, 1) << get values)
)
),
Panel Box("Match",
H List Box(align("top"),
Button Box("Match",
<< Set Function(function({this},
from_selections = window:lb_from << get selected;
to_selections = window:lb_to << get selected;
pairs = {};
For Each({{from, to}}, Across(from_selections, to_selections, Count("Shortest")),
Insert Into(pairs, Eval Insert("^from^=^to^"));
);
window:lb_match << Append(pairs);
))),
window:lb_match = List Box({}, << Set N Lines(20))
)
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK", << Set Function(function({this},
selections = window:lb_match << get items;
from_values = {};
to_values = {};
For Each({selection}, selections,
{from, to} = Words(selection, "=");
Insert Into(from_values, from);
Insert Into(to_values, to);
);
dt_result = New Table(Eval Insert("^(dt1 << get name)^ mapped to ^(dt2 << get name)^"),
New Column(Column(dt1, 1) << get name, Character, Nominal, Values(from_values)),
New Column(Column(dt2, 1) << get name, Character, Nominal, Values(to_values))
);
If(!(window:cb_keepdialog << get),
this << close window;
);
))),
Button Box("Cancel", << Set Function(function({this}, this << close window))),
Spacer Box(Size(0, 10)),
Button Box("Remove",
window:lb_match << Remove Selected();
),
window:cb_keepdialog = Check Box({"Keep Dialog Open"}, << Set All(1))
)
)
)
);
Write();
Il y a beaucoup d'améliorations qui pourraient être apportées telles que la sélection des colonnes, le nettoyage de l'interface utilisateur, la gestion des erreurs, ...
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLBonjour Jarmo, merci beaucoup. C'est très utile. Dans votre code, vous comparez les premières colonnes de chaque table. Pouvons-nous modifier ce code pour qu'une colonne spécifique d'une table, située à un endroit aléatoire, puisse être comparée à une colonne spécifique (quel que soit le numéro de colonne) de la seconde table ?
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLIl est facile de le modifier. L'utilisateur doit-il sélectionner une colonne de la première table, puis supposer qu'elle existe dans la seconde ? Ou doit-il pouvoir sélectionner des colonnes des deux tables ?
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLIdéalement, l’utilisateur devrait pouvoir choisir des colonnes dans les deux tables.
Merci beaucoup.
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLJe suppose qu'il s'agirait d'une seule colonne des deux tables ? J'aurais le temps aujourd'hui d'ajouter les mises à jour nécessaires au script.
Re : Mappage de colonnes dans deux tables différentes par sélection manuelle à l'aide de JSLLa création de cette page prendra plus de temps que prévu, car l'utilisateur doit également pouvoir sélectionner la deuxième table, ce qui complique considérablement la tâche en raison du comportement des boîtes d'affichage « esthétiques » lors des changements de table (voir le sélecteur de colonnes de filtre et la liste déroulante des colonnes…). De plus, j'ai moins de temps le soir que prévu.
J'ai également commencé à créer des interfaces utilisateur plus complexes, mais je me suis rendu compte que cela n'avait aucun intérêt, car la plateforme Recode de JMP devrait s'en charger. Je vous suggère de créer une liste de souhaits à ce sujet (je peux également en créer une, mais j'ai quelques suggestions supplémentaires).