使用 JSL 拆分列並基於拆分創建多個倍數你好,
我需要讀取現有表並找到感興趣的列[假設列名稱是“資料”]。
「資料」列是用「點」分隔的數字,並且具有相同的長度。
我的目標是打開此表,讀取“資料”列,刪除“點”並建立新列[根據值的長度],每列保存每個值。
原表:
數據
------
123.56.8.342
431.02.0.567
318.00.1.816
……
預期輸出:
數據 c1 c2 c3 c4 c5 c6 c7 c8 c9
-------------------------------------------------- ----------------------------
123.56.8.342 1 2 3 5 6 8 3 4 2
431.02.0.567 4 3 1 0 2 0 5 6 7
318.00.1.816 3 1 8 0 0 1 8 1 6
在我的第一次嘗試[Trial1.jmp] 中,我有2 個for 循環[用於創建列的內部循環,以及用於行數的其他循環],它正在創建更多列[即讀取的資料寬度* 行數] 。
在我的第二次嘗試 [trail2.jmp] 中,我得到了正確的列數,但值是靜態的。
附件是我的jsl。
感謝您的幫助,為此熬夜:(
謝謝,
大衛
大規模客製化品質和工藝工程回覆:使用 JSL 拆分列並基於拆分創建多個倍數兩種方法各有優點。 公式方法將允許新增行和更改日期值,並且 c1....cn 列將自動調整。 設定每個值的優點是提供靜態值,這可以證明更有效,因為公式不必運行多次。回覆:使用 JSL 拆分列並基於拆分創建多個倍數謝謝吉姆。
你有優雅的解決方案。
根據您提出的方法,我注意到看到 col 名稱沒有繼續,[即。當遇到「點」時跳過 Col #];需要一些小列名按摩[我照顧了]。
問題:
您是否建議讓列具有公式並使用 eval/substitute 或按照 Jamo 從效能角度建議的那樣「設定每個值」?
謝謝,
大衛
回覆:使用 JSL 拆分列並基於拆分創建多個倍數感謝 Jamo 讓我知道我錯過了什麼。 我知道我已經很接近了;)
不了解「設定每個值」內建函數。
是的,一切正常!
謝謝,
大衛
回覆:使用 JSL 拆分列並基於拆分創建多個倍數以下是我將如何完成您的請求。Substitute() 函數允許公式在公式中包含變數「i」的實際值,而不是變數「i」的引用
Names Default To Here( 1 );
dt = Current Data Table();
col = Column( dt, "DATA" );
colLength = Length( col[1] );
For( i = 1, i <= colLength, i++,
If( Substr( col[1], i, 1 ) != ".",
Eval(
Substitute(
Expr(
dt << New Column( "c" || Char( i ), Numeric, Continous, Formula( Num( Substr( :data, __i__, 1 ) ) ) )
),
Expr( __i__ ), i,
)
)
)
);回覆:使用 JSL 拆分列並基於拆分創建多個倍數我只檢查了 .jsl 的版本 2,它非常接近。
我已附上修改後的版本。
我主要修改了循環部分。 最有可能的方法是在沒有 Eval(Parse()) 的情況下使用表達式進行管理,但這次我採用了這個解決方案。 您使用的是變數 clean_DATA 中的數據,該數據對於所有行都保持不變。 此外,如果您需要公式,則必須使用 Eval(Parse()) (或表達式?)來保持公式在資料表中運作。 如果不需要公式,我會使用 << 設定每個值而不是公式。
For(i = 1, i <= ncols_to_add, i++, // the || operator joins two strings
Eval(Parse("dt << New Column(\!"c\!" || Char(i),Numeric, Continous,
Formula(Num(Substr(Regex(:data, \!"\D\!", \!"\!", GLOBALREPLACE ), "||char(i)||", 1 )));
)));")); // put 1 bit in each column
);使用 << Set Each Value 時,for 迴圈將如下所示:
For(i = 1, i <= ncols_to_add, i++, // the || operator joins two strings
dt << New Column("c" || Char(i),Numeric, Continous,
<< Set Each Value(Num(Substr(Regex(:data, "\D", "", GLOBALREPLACE ), i, 1 )));
)
); // put 1 bit in each column
編輯:
關於使用 Eval Insert、Eval Expr、Parse 和 Replace with Formula 的好文章https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998