열을 분할하고 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 루프[열을 생성하기 위한 내부 루프 및 행 수에 대한 다른 루프]가 있는 경우 더 많은 열을 생성합니다[즉, 읽은 데이터의 너비 * 행 수] .
두 번째 시도 [trail2.jmp]에서 올바른 열 수를 얻었지만 값은 정적입니다.
첨부는 내 jsl입니다.
자정의 기름을 태워 도움을 주셔서 감사합니다 
감사해요,
다윗
데이터 테이블Re: 열을 분할하고 JSL을 사용하여 분할을 기반으로 여러 다중 생성두 방법 모두 장단점이 있습니다. 수식 방법을 사용하면 새 행을 추가하고 날짜 값을 변경할 수 있으며 c1....cn 열이 자동으로 조정됩니다. 각 값을 설정하면 정적 값이 제공되므로 공식을 여러 번 실행할 필요가 없기 때문에 더 효율적일 수 있습니다.Re: 열을 분할하고 JSL을 사용하여 분할을 기반으로 여러 다중 생성고마워 짐.
당신은 우아한 솔루션이 있습니다.
귀하가 제안한 방법에 따라 col 이름이 계속되지 않는 것을 확인했습니다. "점"이 나타날 때마다 Col #을 건너뜁니다.]; 작은 열 이름 마사지가 필요합니다.
질문:
열에 수식이 있고 eval/substitute를 사용하거나 성능 관점에서 Jamo가 제안한 것처럼 "각 값 설정"을 사용하도록 제안하시겠습니까?
감사해요,
다윗
Re: 열을 분할하고 JSL을 사용하여 분할을 기반으로 여러 다중 생성내가 놓친 것을 알려준 Jamo에게 감사합니다. 나는 내가 가까이 있다는 것을 알고 있었다;)
함수에 내장된 "각 값 설정"에 대해 알지 못합니다.
예, 모든 것이 작동합니다!
감사해요,
다윗
Re: 열을 분할하고 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,
)
)
)
);Re: 열을 분할하고 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 및 Substitute with formula 사용에 대한 좋은 게시물 https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998