Abgleichen der ID_HEX-Liste mit der globalen ReferenztabelleHallo zusammen,
Ich arbeite in JMP mit zwei Tabellen:
- TPMS_Sensor_install_DATA.jmp: enthält eine einzelne Schlüsselspalte ID_HEX.
- TableID Globale.jmp enthält die Schlüsselspalten-ID zusammen mit allen beschreibenden Spalten (Ref-Produkt, Produktname, Datum, Betreiber usw.).
Ziel: Filtern Sie die globale Tabelle, sodass nur Zeilen gespeichert werden, deren ID in meiner ID_HEX-Liste erscheint, und geben Sie dann nur die Spalten „Ref Produit“ und „ProductName“ zurück.
Hier ist das Skript, das ich ausprobiert habe. Es gibt letztendlich die gesamte globale Tabelle ungefiltert zurück:
// 1. Open both tables invisibly
dtSensor = Open( "D:\\Project JMP\\IDEnorme\\TPMS_Sensor_install_DATA.jmp", Invisible );
dtGlobal = Open( "D:\\Project JMP\\Tables Données\\TableID Globale.jmp", Invisible );
// 2. Extract the list of ID_HEX values from dtSensor
hexList = Column( dtSensor, "ID_HEX" ) << Get Values;
// 3. Subset dtGlobal: keep only rows where :ID is in hexList,
// and select only Ref Produit + ProductName
dtResult = dtGlobal << Subset(
Where( Contains( hexList, :ID ) ),
Select(
:"Ref Produit",
:"ProductName"
),
Output Table Name( "Résultats Correspondance" )
);
// 4. Show the result
dtResult << Show Window;
Kann mir jemand helfen, dieses Skript zu korrigieren, sodass es „TableID Globale“ tatsächlich nach der HexList der ID_HEX-Werte filtert und nur die Spalten „Ref Produit“ und „ProductName“ mit der übereinstimmenden ID zurückgibt?
Alle Hinweise oder Beispiel-JSL-Ausschnitte sind sehr willkommen!
Dank im Voraus !
Automatisierung und SkriptingWindowsBetreff: ID_HEX-Liste mit globaler Referenztabelle abgleichenHaben Sie versucht, ob Join für Sie ausreicht? Eine andere Möglichkeit wäre die Verwendung von << Zeilen abrufen. Hier erhalten Sie die relevanten Zeilen und die darauf basierende Teilmenge.
rows_of_interest = dtGlobal << Get Rows Where(Contains(hexList, :ID));
dt_new = dtGlobal << Subset(Rows(rows_of_interest), Columns(:Ref Produit, :ProductName), Output table("Filtered"));
oder etwas ähnliches
Betreff: ID_HEX-Liste mit globaler Referenztabelle abgleichenIch habe es versucht, aber das Skript benötigt extrem viel Zeit und erzeugt keine Ausgabe. Es scheint komplett zu hängen. Zum Vergleich: dtGlobal enthält 12 Millionen Zeilen und dtSensor 400.000.
dtSensor = Open( "D:\\Project JMP\\IDEnorme\\TPMS_Sensor_install_DATA.jmp", Invisible );
dtGlobal = Open( "D:\\Project JMP\\Tables Données\\TableID Globale.jmp", Invisible );
hexList = Column( dtSensor, "ID_HEX" ) << Get Values;
rows_of_interest = dtGlobal << Get Rows Where(
Contains( hexList, :ID )
);
dtResult = dtGlobal << Subset(
Rows( rows_of_interest ),
Select(
:Ref Produit,
:ProductName
),
Output Table Name( "Résultats Correspondance" )
);
dtResult << Show Window;
Betreff: ID_HEX-Liste mit globaler Referenztabelle abgleichenSie können die Duplikate auf Ihrem dtSensor beispielsweise durch die Verwendung von Summarize entfernen. Dies hilft etwas
Summarize(dtSensor, hexList = By(:ID_HEX));
Betreff: ID_HEX-Liste mit globaler Referenztabelle abgleichenusing an associative array, you should see <2 minutes</CODE></P>
<PRE><CODE class=" language-jsl">dtSensor = Open( "$DESKTOP/TPMS_Sensor_install_DATA.jmp" );
hexList = Column( dtSensor, "ID_HEX" ) << Get Values; //1048575
lookup = Associative Array( hexList );//231356
hexList = lookup << getkeys; // the keep list.
// manufacture a 12 million row table with 50% matches
n = 12e6; // about 1/4 minute to build a test table...
dtGlobal = New Table( "Untitled",
Add Rows( n ),
New Column( "ID_HEX",
Character,
"Nominal",
Set Values( Transform Each( {v}, Repeat( {"1", "0"}, n / 2 ), If( v == "1", "badc0de", hexlist[Random Integer( 1, N Items( hexlist ) )] ) ) )
),
New Column( "Ref Produit", setvalues( 1 :: n ) ), // even rows match the keep list
New Column( "ProductName", setvalues( 1 :: n ) ) // odd rows are badc0de, not in keep list
);
unwantedrows = dtGlobal << get rows where( !(lookup << Contains( ID_HEX )) ); // about a minute to identify the rows
dtGlobal << deleterows( unwantedrows );
Betreff: ID_HEX-Liste mit globaler Referenztabelle abgleichenIch habe wie von Jthi vorgeschlagen Duplikate aus beiden Datentabellen entfernt, die Methode des assoziativen Arrays verwendet und es hat funktioniert!
Vielen Dank für die Hilfe!
Betreff: ID_HEX-Liste mit globaler Referenztabelle abgleichenIch empfehle die Verwendung von Summarize, wenn nur die Liste verwendet wird und die Werte Zeichenfolgen sind . Die Verwendung eines assoziativen Arrays zur Entfernung von Duplikaten wird bei größeren Datensätzen langsam. Die Summary-Tabelle ist bei großen Datentabellen am schnellsten, erfordert aber etwas mehr Code, bietet aber Vorteile, wie z. B. die Beibehaltung von Zahlen als Zahlen. Die Reihenfolge kann zwischen Associative Array und Summary/Summarize unterschiedlich sein.
Mehr anzeigen...
Names Default To Here(1);
dttemp = Open("$DOWNLOADS/TPMS_Sensor_install_DATA.jmp");
hexList = Column(dttemp, "ID_HEX") << Get Values;
lookup = Associative Array(hexList);
hexList = lookup << getkeys;
n = 12e6;
dt = New Table("Untitled",
Add Rows(n),
New Column("ID_HEX",
Character,
"Nominal",
Set Values(
Transform Each({v}, Repeat({"1", "0"}, n / 2),
If(v == "1",
"badc0de",
uniq[Random Integer(1, N Items(uniq))]
)
)
)
),
Private
);
Close(dttemp, no save);
wait(0);
s = Tick Seconds();
Summarize(dt, uniq_summarize = By(:ID_HEX));
wait(0);
summarize_dur = Tick Seconds() - s;
wait(0);
s = Tick Seconds();
uniq_aa = Associative Array(:ID_HEX) << get keys;
wait(0);
aa_dur = Tick Seconds() - s;
wait(0);
s = Tick Seconds();
vals = Column(dt, "ID_HEX") << Get Values;
aa = Associative Array(vals);
uniq_aa2 = Associative Array(aa) << get keys;
wait(0);
aa2_dur = Tick Seconds() - s;
wait(0);
s = Tick Seconds();
dt_summary = dt << Summary(
Group(:ID_HEX),
Freq("None"),
Weight("None"),
output table name("Summary of Untitled grouped by ID_HEX"),
Private
);
uniq_summary = dt_summary[0, 1];
Close(dt_summary, no save);
wait(0);
summary_dur = Tick Seconds() - s;
Close(dt, no save);
Show(N Items(uniq_summarize), N Items(uniq_aa), N Items(uniq_aa2), N Items(uniq_summary));
Show(summarize_dur, aa_dur, aa2_dur, summary_dur);
N Items(uniq_summarize) = 231357;
N Items(uniq_aa) = 231357;
N Items(uniq_aa2) = 231357;
N Items(uniq_summary) = 231357;
summarize_dur = 2.36666666666861;
aa_dur = 32.5166666666628;
aa2_dur = 32.25;
summary_dur = 1.30000000000291;
Abhängig von den tatsächlichen Daten kann dies höchstwahrscheinlich recht schnell erfolgen, da nicht zu viele Zeilen vorhanden sind, als dass JMP sie problemlos verarbeiten könnte.