ID_HEX 목록을 글로벌 참조 테이블에 일치시키기안녕하세요 여러분,
저는 두 개의 테이블을 사용하여 JMP에서 작업하고 있습니다.
- TPMS_Sensor_install_DATA.jmp: ID_HEX라는 단일 키 열을 포함합니다.
- TableID Globale.jmp에는 모든 설명 열(참조 제품, 제품 이름, 날짜, 운영자 등)과 함께 키 열 ID가 포함되어 있습니다.
목표: 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;
누군가 이 스크립트를 수정해서 다음과 같이 할 수 있도록 도와줄 수 있나요? ID_HEX 값의 hexList로 TableID Globale을 실제로 필터링하고 ID가 일치하는 Ref Produit 및 ProductName 열만 반환합니다.
어떤 조언이나 JSL 스니펫 예시라도 알려주시면 감사하겠습니다!
미리 감사드립니다!
자동화 및 스크립팅윈도우Re: ID_HEX 목록을 글로벌 참조 테이블에 일치시키기join만으로 충분할지 시도해 보셨나요? 다른 옵션은 << 행 가져오기를 사용하여 관심 있는 행을 가져오고 해당 행을 기준으로 하위 집합을 만드는 것입니다.
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에는 1,200만 개의 행이 있고 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를 사용하는 것이 좋습니다. 중복 제거에만 연관 배열을 사용하면 데이터 세트가 클수록 속도가 느려집니다. 요약 테이블은 대용량 데이터 테이블에서 가장 빠르지만, 코드가 약간 더 많이 필요합니다. 하지만 숫자를 숫자로 유지하는 등의 이점이 있습니다. 연관 배열과 요약/요약 테이블의 순서도 다를 수 있습니다.
더 보기...
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가 쉽게 처리할 수 있는 행이 많지 않으므로 이 작업은 매우 빠르게 완료될 가능성이 높습니다.