Bonjour,
J'ai 2 tables (Table1 et Table2), toutes deux interrogées à partir de bases de données.
Je dois mettre à jour Table1 avec Table2 en faisant correspondre les colonnes (:match).
Le problème est :
- J'obtiens :match content pour Table1 avec une Regex de la base de données avec (parfois) ce format : « XXXX-YY-ZZZ ».
- J'obtiens le contenu :match pour Table2 d'une autre base de données avec un format différent mais cohérent : « XXXXYYZZZ ».
Je peux utiliser manuellement If() et Subsitute() pour me débarrasser de « - » dans une étape supplémentaire, mais je dois effectuer une boucle sur un grand nombre de mises à jour de table avec le format de colonne correspondant généralement. J'aimerais éviter cette voie si possible.
Je vois deux solutions possibles :
1- Existe-t-il un moyen élégant dans Update() qui pourrait rechercher la « correspondance la plus proche » entre les colonnes en ignorant des caractères spécifiques ?
2- Existe-t-il un moyen de faire correspondre une chaîne de caractères spécifique avec Regex comme « XXXX-YY-ZZZ » mais de n'afficher que « XXXXYYZZZ » ? Pour que je puisse corriger en amont le format de :match dans table1
Si vous avez une autre approche en tête, j’aimerais bien l’entendre.
Ci-dessous un exemple de script avec l'étape « supplémentaire »
Merci,
- le prédicateur
Names Default To Here( 1 );
dt1 = New Table( "Table1",
Add Rows( 20 ),
New Column( "match", // format "XXX-YY-ZZZ"
Character,
"Nominal",
set values({"786-79-6822", "413-31-2411", "286-37-3500", "985-96-1683", "641-67-8572","537-38-5509", "136-71-5147", "965-59-8232", "141-62-8885", "212-98-2829","330-28-2219", "938-39-3349", "203-47-1149", "310-16-8252", "273-85-3049","543-87-1778", "784-24-3481", "708-81-6285", "902-33-5331", "763-59-8837"})
),
New Column( "Value1",
Character,
"Nominal",
set values ( {"1.7826391133", "3.4239116441", "0.1994181285", "3.5850992007", "1.8049403103", "2.3814269388", "2.3045256995", "3.3546657711", "2.341782487", "1.9017582694", "1.5864833118", "1.3739423649", "2.0963420644", "0.4244481763", "3.6469046306", "3.1553423936", "0.6822735481", "3.9464927437", "0.7582216617", "0.9802403664"})
)
);
dt2 = New Table( "Table2",
Add Rows( 20 ),
New Column( "match", // format "XXXYYZZZ"
Character,
"Nominal",
set values({"537385509", "708816285", "938393349", "543871778", "286373500", "902335331", "784243481", "273853049", "641678572", "203471149", "985961683", "413312411", "786796822", "965598232", "136715147", "763598837", "330282219", "212982829", "141628885", "310168252"}
)
),
New Column( "Value2",
Character,
"Nominal",
set values ( {"1.7489787", "1.763834", "3.0609319", "0.7657611", "2.0515768", "0.8648471", "1.0966909", "1.5494098", "2.7582114", "1.1778722", "2.8651535", "2.3157859", "4.3617672", "0.7137677", "1.1055379", "1.8654949", "4.0616821", "2.3122891", "1.9496742", "2.3774745"})
)
);
// I would like to remove this extra step (it doens't apply on all tables I need to loop through...
dt1 << new column ("Column 3",Character,"Nominal",formula(substitute(:match,"-","")));
// ...and make the Update() more robust with a "nearest match", not "exact "match"
dt1 << Update (
with (dt2),
match columns (Column("Column 3") == Column("match"))
)Salut Jim,
Si j'ajoute l'étape de suppression du "-" avec substitute() comme décrit dans mon script, cela fonctionne.
Si je le fais avec mes données réelles, cela fonctionne aussi, mais j'aimerais éviter cette étape, car toutes mes Table1 n'ont pas le "-" supplémentaire dans la colonne :match
Si vous pouvez simplement utiliser Substitute(), faites-le. La mise à jour/jointure de JMP n'a pas d'options "les plus proches" pour la jointure (et c'est plus difficile car vous le faites sur la base de chaînes où la question est "qu'est-ce qui est le plus proche"). Vous pouvez également utiliser Transform Columns si vous ne voulez pas en créer de nouvelles (faire fonctionner cela peut demander un peu plus d'efforts au début)
// Update data table
Data Table("Big Class") << Update(
With(Data Table("Untitled")),
Match Columns(
Transform Column("Concatenate[name]", Character, Formula(Concat(:name))) =
:Column 1
)
);
Le script de la fonction « Grouper les valeurs similaires » dans la plate-forme Recode avec JSL et le besoin de joindre deux tables basées sur des chaînes non identiques (utiliser Regex ?) dans JSL (votre message) peuvent donner quelques idées sur la façon de joindre par correspondance de chaîne la plus proche si vous voulez vraiment suivre cette voie.
Salut Jim,
Ma contrainte était que tous les cas n'avaient pas besoin de cette transformation, donc je voulais que mon script soit plus intelligent. Mais j'ai trouvé une solution :
Je recherche "-" avec un IF() CONTAINS(), et si c'est vrai, je fais un double REGEX() : Le premier pour chercher le motif à faire correspondre, et le second pour appliquer la transformation (supprimer "-").
Ce n'est pas super élégant mais ça marche et c'est assez robuste.
Merci encore, comme toujours:)
- le prédicateur
- le prédicateur
Salut Jarmo,
J'ai rencontré quelques problèmes avec l'approche de la dernière fois : besoin de joindre deux tables basées sur des chaînes non identiques (utiliser Regex ?) en JSL
le taux de faux positifs était un peu problématique. S'il n'y a pas de correspondance « la plus proche », je dois laisser la cellule vide au lieu de forcer une correspondance, ce qui était en quelque sorte l'esprit de cette approche.
Au lieu de cela, j'ai résolu ce problème comme décrit dans la réponse à Jim en utilisant une double expression régulière avec une condition. De cette façon, j'évite les faux positifs.
Mais merci beaucoup d'être intervenu comme toujours
- le prédicateur