拆分列并使用 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 循环 [用于创建 cols 的内部循环,以及用于创建行数的其他循环],它正在创建更多列 [即读取的数据宽度 * 行数] .
在我的第二次尝试 [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()) (或表达式?)来保持公式在数据表中工作。 如果不需要公式,我会使用 << Set Each Value 而不是公式。
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 和 Substitute 和公式的好帖子https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998