Ciao,
Ho 2 tabelle (Tabella1 e Tabella2), entrambe interrogate da database.
Devo aggiornare la Tabella 1 con la Tabella 2 abbinando le colonne (:match).
Il problema è:
- Ottengo il contenuto :match per la Tabella 1 con un'espressione regolare dal database con (a volte) questo formato: "XXXX-YY-ZZZ".
- Ottengo il contenuto :match per la Tabella 2 da un altro database con un formato diverso ma coerente: "XXXXYYZZZ".
Posso usare manualmente If() e Subsitute() per sbarazzarmi di “-“ in un passaggio extra, ma ho bisogno di fare un ciclo su un numero elevato di aggiornamenti di tabella con il formato di colonna solitamente corrispondente. Vorrei evitare questa strada, se possibile.
Vedo due possibili soluzioni:
1- Esiste un modo elegante all'interno di Update() che potrebbe cercare la "corrispondenza più vicina" tra le colonne ignorando caratteri specifici?
2- Esiste un modo per abbinare una specifica catena di caratteri con Regex come "XXXX-YY-ZZZ" ma restituire solo "XXXXYYZZZ"? In modo da poter correggere a monte il formato di :match in table1
Se hai in mente un altro approccio, mi piacerebbe molto conoscerlo.
Di seguito uno script di esempio con il passaggio “extra”
Grazie,
- il predicatore
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"))
)Ciao Jim,
Se aggiungo il passaggio di rimozione del "-" con substitute() come descritto nel mio script, funziona.
Se lo faccio con i miei dati reali, funziona lo stesso, ma vorrei evitare questo passaggio, perché non tutte le mie Table1 hanno il "-" in più nella colonna :match
Se puoi usare semplicemente Substitute(), fallo. L'aggiornamento/join di JMP non ha opzioni "nearest" per l'unione (e questo è più difficile perché lo fai in base a stringhe in cui la domanda è "what is nearest"). Puoi anche usare Transform Columns se non vuoi crearne di nuove (far funzionare questa cosa inizialmente può richiedere un po' più di impegno)
// Update data table
Data Table("Big Class") << Update(
With(Data Table("Untitled")),
Match Columns(
Transform Column("Concatenate[name]", Character, Formula(Concat(:name))) =
:Column 1
)
);
Crea uno script per la funzione "Raggruppa valori simili" nella piattaforma Recode con JSL e Devi unire due tabelle in base a stringhe non identiche (usi Regex?) in JSL (il tuo post) può darti qualche idea su come unire in base alla corrispondenza della stringa più vicina, se vuoi davvero seguire questa strada.
Ciao Jim,
Il mio vincolo era che non tutti i casi necessitavano di questa trasformazione, quindi volevo che il mio script fosse più intelligente. Ma ho trovato una soluzione:
Cerco "-" con IF() CONTAINS() e, se è vero, eseguo una doppia REGEX(): la prima per cercare il pattern corrispondente e la seconda per applicare la trasformazione (rimuovere "-").
Non è molto elegante, ma funziona ed è abbastanza robusto.
Grazie ancora, come sempre:)
- il predicatore
- il predicatore
Ciao Jarmo,
Ho riscontrato alcuni problemi con l'approccio dell'ultima volta: è necessario unire due tabelle in base a stringhe non identiche (usare Regex?) in JSL
il tasso di falsi positivi era un po' un problema. Se non c'era una corrispondenza "più vicina", dovevo lasciare la cella vuota invece di forzare una corrispondenza, che era in un certo senso lo spirito di questo approccio.
Invece ho risolto questo problema come descritto nella risposta a Jim, usando una doppia regex con una condizione. In questo modo evito falsi positivi.
Ma grazie mille per essere intervenuto come sempre
- il predicatore