我有一個數據表,它由多行單獨的測量值組成,我在執行表拆分功能之前要對其進行修剪,但是我想刪除一些冗餘測量值,但當前代碼我有問題我正在使用的速度非常慢,而且對於我需要的東西可能效率低下。
背景資料:
- 每行都是對連續執行的一塊材料進行單獨自動測量的結果,並生成包含以下列的報告:
- 分配給每塊材料的唯一部件 ID [ PartID ]
- 與用於創建單個材料 [LotID] 的原材料相關聯的批次 ID
- 所執行測量的實際測量值 [值]
- 基於測量值分配的測量結果(通過/失敗/返工)[結果]
- 測量時間戳 [ Date_Created ]
我的設備為每件材料生成數十行測量值,並在每個報告中處理數千件材料 - 然後將這些報告作為我的原始數據表輸入 JMP。每個報告還包含多個批次,因此數據表有多個對“PartID = 1”的引用,因為每個批次都有一個從 1 開始的序列號,因此我需要同時使用 PartID 和 LotID 來引用給定的材料。在結果為“返工”的情況下,測量設備停止對該單件材料的任何進一步測量,重新定位該材料,並將其返回到生產線的起點,重新測量所有先前的測試材料,但仍保留與該材料相關聯的唯一零件 ID。
期望的結果:
我想使用腳本來遍歷數據表並消除所有測量結果(包括)返工結果,因為在返工後,所有測量都會重複,返工會影響測量值。為此,我目前正在使用 JSL 腳本遍歷每一行並執行以下操作:
- 識別結果是否為“返工”;如果是這樣,請執行以下操作:
- 將給定材料的 PartID 標識為“xPartID”
- 將給定材料的 LotID 標識為“xLot”
- 將給定測量的 Date_Created 標識為“xDate”
- 選擇並刪除 (PartID = xPartID) 和 (LotID = xLot) 和 (Date_Created <= xDate) 的所有行
- 如果結果不是“返工”,則退出循環,無需繼續。
我一直在極度減速,基本上代碼會導致程序崩潰。如果我逐步運行它,它似乎可以工作,但如果讓它運行它最終會死掉。 這是實際的代碼:
//Recoding the two potential "Rework" results into a shared value "aRework"; putting the letter "a" in front of it so if I sort by the column ascending then all of these values are at the start of the list, to hopefully make it easier and faster to process them.
dt << Recode Column(
dt:result,
{Map Value(
_rcOrig,
{"FailOnHighRework", "aRework",
"FailOnLowRework", "aRework"},
Unmatched( _rcNow )
)},
Update Properties( 1 ),
Target Column( :result )
);
//Sorting the table using the result column after the recode, so all of the rework rows are at the start of the table
SortColumn = "result";
dt << Sort( By( :result ), Replace Table, Order( Ascending ), Suppress formula evaluation( 1 ) );
//now run the row-by-row script
dt << begin data update;
for each row(
If( :result == "aRework",
xRow = Row();
xPartID=:PartID[Row()];
xLot=:lot[Row()];
xDate=:date_created[Row()];
dt <<SELECT where=""></SELECT>我正在使用 JMP 16.2.0 (570548)。