拆分一列并使用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 /替代或使用“设置每个值”进行设置?
谢谢,
大卫