拆分一列並使用JSL基於拆分創建多個倍數你好,
我需要閱讀現有表並找到感興趣的列[說該列名稱為“ data”]。
“數據”列為數字,以“點”定界,並且具有相同的長度。
我的目標是打開此表,讀取“數據”列,刪除“點”並創建新列(根據值的長度),每個列都包含每個值。
原始表:
數據
------
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循環[用於創建cols的內部循環,以及用於#行的其他循環],它正在創建更多列[即,讀取的數據寬度*行數,否] 。
在我的第二次嘗試[trail2.jmp]中,我得到了正確的cols#,但是值是靜態的。
附件是我的jsl。
欣賞幫助,為此燒上午夜的油:(
謝謝,
大衛
數據表回复:拆分列並使用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
);使用<<設置每個值,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回复:拆分列並使用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基於拆分創建多個倍數感謝Jamo讓我知道我在想什麼。 我知道我很近;)
了解有關內置函數“設置每個值”的信息。
是的,一切正常!
謝謝,
大衛
回复:拆分列並使用JSL基於拆分創建多個倍數謝謝吉姆。
您有很好的解決方案。
根據您提出的方法,我注意到列名沒有繼續,[即遇到“點”時跳過Col#);很少需要對列名稱進行按摩[我已照顧好]。
題:
從性能的角度來看,您是否建議讓列具有公式並使用eval /替代或使用“設置每個值”進行設置?
謝謝,
大衛