Hallo,
Ich habe 2 Tabellen (Tabelle1 und Tabelle2), die beide aus Datenbanken abgefragt werden.
Ich muss Tabelle1 mit Tabelle2 durch Abgleichen der Spalten (:match) aktualisieren.
Das Problem ist:
– Ich erhalte :match-Inhalt für Tabelle1 mit einem regulären Ausdruck aus der Datenbank mit (manchmal) diesem Format: „XXXX-YY-ZZZ“.
– Ich erhalte :match-Inhalt für Tabelle2 aus einer anderen Datenbank mit einem anderen, aber konsistenten Format: „XXXXYYZZZ“.
Ich kann If() und Substitute() manuell verwenden, um „-“ in einem zusätzlichen Schritt zu entfernen, aber ich muss eine Schleife über eine große Anzahl von Tabellenaktualisierungen ausführen, wobei das Spaltenformat normalerweise übereinstimmt. Diesen Weg möchte ich nach Möglichkeit vermeiden.
Ich sehe zwei mögliche Lösungen:
1- Gibt es eine elegante Möglichkeit innerhalb von Update(), durch Ignorieren bestimmter Zeichen nach der „nächsten Übereinstimmung“ zwischen Spalten zu suchen?
2- Gibt es eine Möglichkeit, eine bestimmte Zeichenfolge mit Regex wie „XXXX-YY-ZZZ“ abzugleichen, aber nur „XXXXYYZZZ“ auszugeben? Damit kann ich das Format von :match in Tabelle1 upstream korrigieren
Wenn Ihnen ein anderer Ansatz einfällt, würde ich ihn gerne hören.
Nachfolgend ein Beispielskript mit dem „extra“ Schritt
Danke,
- der Prediger
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"))
)Hallo Jim,
Wenn ich den Schritt des Entfernens des "-" mit substitute() hinzufüge, wie in meinem Skript beschrieben, funktioniert das.
Wenn ich es mit meinen echten Daten mache, funktioniert es auch, aber ich möchte diesen Schritt vermeiden, da nicht alle meiner Table1 das zusätzliche "-" in der Spalte :match haben
Wenn Sie können, verwenden Sie einfach Substitute(). JMPs Update/Join hat keine „nächsten“ Optionen zum Verbinden (und das ist schwieriger, da Sie es basierend auf Zeichenfolgen tun, bei denen die Frage lautet „was ist am nächsten“). Sie können auch Transform Columns verwenden, wenn Sie keine neuen erstellen möchten (das zum Laufen zu bringen kann anfangs etwas aufwändiger sein).
// Update data table
Data Table("Big Class") << Update(
With(Data Table("Untitled")),
Match Columns(
Transform Column("Concatenate[name]", Character, Formula(Concat(:name))) =
:Column 1
)
);
Erstellen Sie ein Skript für die Funktion „Ähnliche Werte gruppieren“ in der Recode-Plattform mit JSL. „ Sie müssen zwei Tabellen basierend auf nicht identischen Zeichenfolgen verbinden (Reguläre Ausdrücke verwenden?)“ in JSL (Ihr Beitrag) kann einige Ideen zum Verbinden nach der größten Zeichenfolgenübereinstimmung liefern, wenn Sie diesen Weg wirklich gehen möchten.
Hallo Jim,
Meine Einschränkung war, dass nicht alle Fälle diese Transformation benötigen, also wollte ich, dass mein Skript intelligenter ist. Aber ich habe eine Lösung gefunden:
Ich suche mit einem IF() CONTAINS() nach „-“, und wenn das zutrifft, führe ich einen doppelten REGEX() aus: Der erste sucht nach dem passenden Muster und der zweite wendet die Transformation an (entfernt „-“).
Es ist nicht super elegant, aber es funktioniert und ist robust genug.
Nochmals vielen Dank, wie immer:)
- der Prediger
- der Prediger
Hallo Jarmo,
Ich habe beim letzten Ansatz einige Probleme festgestellt: Zwei Tabellen müssen in JSL auf Basis nicht identischer Zeichenfolgen verknüpft werden (Reguläre Ausdrücke verwenden?)
Die Rate der falsch positiven Ergebnisse war ein kleines Problem. Wenn es keine „nächste“ Übereinstimmung gibt, muss ich die Zelle leer lassen, anstatt eine Übereinstimmung zu erzwingen, was gewissermaßen dem Sinn dieses Ansatzes entsprach.
Stattdessen habe ich dieses Problem wie in der Antwort an Jim beschrieben gelöst, indem ich einen doppelten regulären Ausdruck mit einer Bedingung verwendet habe. Auf diese Weise vermeide ich falsche Positivmeldungen.
Aber vielen Dank, dass du wie immer mitgeholfen hast
- der Prediger