Correspondance de la liste ID_HEX avec la table de référence globaleSalut tout le monde,
Je travaille dans JMP avec deux tables :
- TPMS_Sensor_install_DATA.jmp : contient une seule colonne clé ID_HEX.
- TableID Globale.jmp contient l'ID de la colonne clé ainsi que toutes les colonnes descriptives (Ref Produit, ProductName, Date, Operator, etc.).
Objectif : Filtrer la table globale afin qu'elle ne conserve que les lignes dont l'ID apparaît dans ma liste ID_HEX, puis renvoyer uniquement les colonnes Ref Produit et ProductName.
Voici le script que j'ai essayé : il finit par renvoyer la table globale entière non filtrée :
// 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;
Quelqu'un peut-il m'aider à corriger ce script afin qu'il : filtre réellement TableID Globale par la hexList des valeurs ID_HEX et renvoie uniquement les colonnes Ref Produit et ProductName avec l'ID correspondant.
Tout pointeur ou exemple d’extrait JSL serait grandement apprécié !
Merci d'avance !
Automatisation et scriptsWindowsRe : Correspondance de la liste ID_HEX avec la table de référence globaleAvez-vous essayé de déterminer si la jointure vous suffirait ? Une autre option serait d'utiliser « Obtenir des lignes » pour obtenir les lignes qui vous intéressent et créer un sous-ensemble basé sur celles-ci.
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"));
ou quelque chose de similaire
Re : Correspondance de la liste ID_HEX avec la table de référence globaleJ'ai essayé, mais le script est extrêmement long et ne produit aucune sortie ; il semble se bloquer complètement. Pour information, dtGlobal contient 12 millions de lignes et 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;
Re : Correspondance de la liste ID_HEX avec la table de référence globaleVous pouvez vous débarrasser des doublons sur votre dtSensor par exemple en utilisant Summarize, cela vous aidera légèrement
Summarize(dtSensor, hexList = By(:ID_HEX));
Re : Correspondance de la liste ID_HEX avec la table de référence globaleusing 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 );
Re : Correspondance de la liste ID_HEX avec la table de référence globaleJ'ai supprimé les doublons des deux tables de données comme Jthi l'a suggéré, j'ai utilisé la méthode du tableau associatif, et cela a fonctionné !
Merci beaucoup pour l'aide !
Re : Correspondance de la liste ID_HEX avec la table de référence globaleJe suggère d'utiliser Summarize si seule la liste est utilisée et que les valeurs sont des chaînes . Utiliser un tableau associatif pour supprimer uniquement les doublons peut être lent avec les jeux de données volumineux. Le tableau récapitulatif est plus rapide avec les tables de données volumineuses, mais il nécessite un peu plus de code. Il présente néanmoins des avantages, comme la conservation des nombres. L'ordre peut également être différent entre un tableau associatif et Summary/Summarize.
Voir plus...
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;
En fonction des données réelles, cela peut probablement être fait assez rapidement car il n'y a pas trop de lignes que JMP peut gérer facilement.