다양한 길이와 위치의 문자열 추출변수(Dx1)에서 문자열을 추출하고 싶은데 문자열의 길이와 위치가 다르지만 대시로 구분되어 있습니다. 대시가 여러 개 있는 경우도 있습니다. 예를 들어...
"7812-abcdef -9"
"v7892-xyz -0"
"812-fghkj -0"
"17361-gf-jhyt -9"
내가 하고 싶은 것은 첫 번째 대시 앞의 숫자/문자를 추출하는 새 변수를 만든 다음 첫 번째 대시와 두 번째 대시 사이의 문자를 추출하는 또 다른 변수를 만드는 것입니다.그래서,
변수1 변수2
7812 abcdef
v7892 xyz
812 fghkj
17361 gf-jhyt
여기에 게시된 예제를 따라해 보았으나 대시만 추출되었습니다. +1을 다른 숫자로 변경하면 해당 문자 수가 추출되지만 데이터 길이는 다양합니다.
https://community.jmp.com/t5/Uncharted/JSL-Character-String-Functions/ba-p/21323
내가 쓴 내용은 다음과 같습니다. 내가 도대체 뭘 잘못하고있는 겁니까?
Trim(
Substr(
:Name( "Dx1" ),
Contains( :Name( "Dx1" ), "-" ),
1
)
)
Re: 다양한 길이와 위치의 문자열 추출그만큼 정규식() 안정성이나 성능 문제가 발생하는 경우 함수는 효율적인 대안이 될 수 있습니다. 열 수식에서 무한대로 진행되는 while 루프는 디버그하기 어려울 수 있습니다.
//Formula for Var1
Regex(Dx1, "(^.*?)-", "\1");
//Formula for Var2
Regex(Dx1, "-(.+)-\d", "\1");
Re: 다양한 길이와 위치의 문자열 추출다시 한 번 고마워요, 짐.
나는 이보다 더 많은 행을 사용했습니다. 그것은 단지 가설이었습니다.
DX1의 모든 경우는 숫자로 끝나지만 Var2에 대해 추출한 것과 해당 숫자 사이의 공백 수는 다양합니다. 어쩌면 그것이 원인이었을 수도 있습니다. 어느 쪽이든 귀하의 솔루션이 작동했습니다.
Re: 다양한 길이와 위치의 문자열 추출65,000행은 JMP가 처리하기에는 그리 큰 테이블이 아닙니다.JMP는 수십억 개의 행이 포함된 데이터 테이블을 처리할 수 있습니다.문제는 데이터 테이블의 데이터 불일치입니다.코드에서는 Var2의 문자 값을 찾은 후 하나 이상의 숫자 필드를 찾을 수 있다고 가정합니다. 분명히 Dx1의 값이 숫자로 끝나지 않는 상황이 있습니다.다음은 해당 문제에 맞게 조정된 형식의 변경 사항입니다.
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1 & Word( i, :Dx1, "-" ) != "",
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
Re: 다양한 길이와 위치의 문자열 추출고마워요, 짐. 그것이 내가 이전에 시도한 방법입니다. 어떤 이유로 JMP Pro 13을 실행하면 충돌이 발생하는 것 같습니다. 내 데이터 테이블이 65,000줄이기 때문일까요?
Re: 다양한 길이와 위치의 문자열 추출포함된 코드는 열 수식입니다.예제에서 사용한 Dx1 열과 함께 열 공식이 지정된 새 Var1 및 Var2 열이 포함된 데이터 테이블을 첨부했습니다.
Re: 다양한 길이와 위치의 문자열 추출고마워요, 짐. 그것이 내가 찾고 있던 것입니다.
이 스크립트를 어떻게 실행합니까? 컬럼 수식으로 해보았습니다. 그것은 효과가 없었지만 그렇게 될 것이라고는 예상하지 못했습니다. 또한 스크립트 창을 열고 거기에서 실행했지만 응답이 멈췄습니다.Re: 다양한 길이와 위치의 문자열 추출다음은 규칙으로 명시한 작업을 수행하는 공식입니다....
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1,
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
그러나 위 샘플에서 "17361-gf-jhyt -9" 샘플은 Var2 값 "gf-jhyt"로 끝납니다.너가 원하는게 그거야?
그럼에도 불구하고 문자열을 올바른 값으로 구문 분석하는 데 필요한 만큼 복잡한 수식을 구성할 수 있다는 것을 알 수 있기를 바랍니다.유일한 제한은 사용해야 하는 규칙을 결정할 수 있어야 한다는 것입니다.
Re: 다양한 길이와 위치의 문자열 추출제가 생각하기에 일관성이 있다고 생각되는 유일한 규칙은 두 번째 단어가 숫자(#) 사이에 나타나는 것입니다. 궁극적으로 나는 하이픈 사이의 문구를 원합니다. 따라서 "#-단어 -#" 및 "#-단어-단어 -#" 및 "#-단어-단어 -#"
Re: 다양한 길이와 위치의 문자열 추출JSL을 사용하면 이러한 복잡한 조건을 구축하고 구문 분석할 수 있습니다.그러한 구문 분석에 대한 규칙이 무엇인지 결정하는 것은 인간의 몫입니다.
귀하의 예에서 하이픈으로 연결된 값을 결합된 값으로 읽어야 하고 언제 별도의 값으로 처리해야 하는지 결정하는 규칙은 무엇입니까?
Re: 다양한 길이와 위치의 문자열 추출WORD에서 일부 대시를 무시하도록 하는 방법이 있습니까? 제가 추출하려는 두 번째 단어 중 일부는 하이픈으로 연결되어 있어 일부만 추출하고 있습니다. 예를 들어, "938-ex-marine"의 경우 "ex-marine" 대신 "938"과 "ex"가 표시됩니다.
Re: 다양한 길이와 위치의 문자열 추출그만큼 단어 기능은 여기 당신의 친구입니다.대시와 공백을 구분 기호로 사용하면 원하는 내용을 쉽게 추출할 수 있습니다.다음은 테이블에서 수식을 사용하는 예입니다.
dt = New Table( "Untitled", Add Rows( 4 ),
New Column( "dx1", Character, "Nominal",
Set Values( {"7812-abcdef -9", "v7892-xyz -0", "812-fghkj -0",
"17361-gf-jhyt -9"}
)
),
// Get the first word for Var1
New Column( "Var1", Character, "Nominal", Formula( Words( :dx1, "- " )[1] ) ),
// Get the second word for Var1
New Column( "Var2", Character, "Nominal", Formula( Words( :dx1, "- " )[2] ) )
);Re: 다양한 길이와 위치의 문자열 추출감사해요! 잘 작동합니다.
Re: 다양한 길이와 위치의 문자열 추출Word() 함수를 사용하고 싶습니다."Var1"이라는 새 열을 만들고 아래 수식을 해당 열에 넣으면 원하는 결과를 얻을 수 있습니다.
word(1,:Dx1,"-")
Var2의 경우 다음과 같습니다.
word(2,:Dx1,"-")
Word() 함수는 스크립팅 색인에 문서화되어 있습니다.
도움말==>스크립팅 색인==>Word
Re: 다양한 길이와 위치의 문자열 추출@jswislar :
이 문제를 해결하는 한 가지 방법은 Contains 및 Substr 함수를 사용하는 것입니다.
a = {"abc-12","abc - 45","abc- 89"};
List1 = list();
List2 = list();
For(i = 1 , i <= N Items(a), i++,
Pos = Contains(a[i],"-");
Insert Into(List1,Substr(a[i],1,Pos-1));
Insert Into(List2,Substr(a[i],Pos+1,Length(a[i])));
);