ID_HEXリストとグローバル参照テーブルのマッチングやあみんな、
私は JMP で 2 つのテーブルを使って作業しています:
- TPMS_Sensor_install_DATA.jmp: 単一のキー列 ID_HEX が含まれます。
- TableID Globale.jmp には、キー列 ID とすべての説明列 (Ref Produit、ProductName、Date、Operator など) が含まれています。
目標: ID_HEX リストに ID が表示される行のみを保持するようにグローバル テーブルをフィルターし、Ref Produit 列と ProductName 列のみを返します。
私が試したスクリプトは次のとおりです。最終的には、フィルタリングされていないグローバル テーブル全体が返されます。
// 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;
どなたかこのスクリプトを修正して、TableID Globale を ID_HEX 値の hexList で実際にフィルタリングし、ID が一致する Ref Produit 列と ProductName 列のみを返すように手伝っていただけますか。
あらゆるポインタや JSL スニペットの例があれば、大いに歓迎します。
前もって感謝します !
自動化とスクリプトウィンドウズRe: ID_HEX リストとグローバル参照テーブルのマッチング結合だけで十分かどうか試してみましたか?他の選択肢としては、<< Get Rows を使って、興味のある行を取得し、それに基づいてサブセット化する方法です。
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"));
または似たようなもの
Re: ID_HEX リストとグローバル参照テーブルのマッチング試してみましたが、スクリプトの実行に非常に時間がかかり、出力も生成されず、完全にハングアップしているように見えます。ちなみに、dtGlobalには1200万行、dtSensorには40万行が含まれています。
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: ID_HEX リストとグローバル参照テーブルのマッチング例えば、Summarizeを使用すると、dtSensorの重複データを削除することができます。これは少し役立ちます。
Summarize(dtSensor, hexList = By(:ID_HEX));
Re: ID_HEX リストとグローバル参照テーブルのマッチングusing 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: ID_HEX リストとグローバル参照テーブルのマッチングJthi の提案に従って両方のデータ テーブルから重複を削除し、連想配列メソッドを使用したところ、うまくいきました。
本当に助かりました!
Re: ID_HEX リストとグローバル参照テーブルのマッチングリストのみを使用し、かつ値が文字列の場合は、Summarizeを使用することをお勧めします。連想配列を重複除去のみに使用すると、大規模なデータセットでは処理速度が低下します。大規模なデータテーブルではSummary Tableが最も高速ですが、コード量は若干多くなります。ただし、数値を数値として保持できるなどのメリットがあります。連想配列とSummary/Summarizeでは順序が異なる場合があります。
もっと見る...
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;
実際のデータによっては、JMP で簡単に処理できるほど行数が多すぎないため、この処理はかなり高速化される可能性があります。