열의 문자열을 구문 분석하고 다른 열 채우기안녕하세요,
ProductName이 포함된 테이블이 있고 OUTPUT 열을 생성하려고 합니다.OUTPUT 열은 ProductID와 Serial#의 연결입니다. Serial#을 정확하게 구문 분석하고 OUTPUT 열을 생성하려면 어떻게 해야 합니까?
일련 번호 예:
- 07-08_13은 일련 번호 07, 08, 13을 의미합니다.
- 09-12는 일련 번호 09, 10, 11, 12를 의미합니다.
- 01-03_05-08은 일련 번호 01, 02, 03, 05, 06, 07, 08을 의미합니다.
- 01_04_05-08은 일련 번호 01, 04, 05, 06, 07, 08을 의미합니다.
- 09_11_13_14는 일련 번호 09,11,13,14를 의미합니다.

| 상품명 | 산출 |
| AABBCC_07-08_13 | AABBCC-07 |
| AABBCC_07-08_13 | AABBCC-08 |
| AABBCC_07-08_13 | AABBCC-13 |
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
| EEFFGG_02 | EEFFGG-02 |
| 헉헉_01-07 | HHIIJJ-01 |
| 헉헉_01-07 | HHIIJJ-02 |
| 헉헉_01-07 | HHIIJJ-03 |
| 헉헉_01-07 | HHIIJJ-04 |
| 헉헉_01-07 | HHIIJJ-05 |
| 헉헉_01-07 | HHIIJJ-06 |
| 헉헉_01-07 | HHIIJJ-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-01 |
| KKLLLMM_01-03_05-08 | KKLLLMM-02 |
| KKLLLMM_01-03_05-08 | KKLLLMM-03 |
| KKLLLMM_01-03_05-08 | KKLLLMM-05 |
| KKLLLMM_01-03_05-08 | KKLLLMM-06 |
| KKLLLMM_01-03_05-08 | KKLLLMM-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-08 |
| NNOOPP_01_04_05-08 | 노놉-01 |
| NNOOPP_01_04_05-08 | 노놉-04 |
| NNOOPP_01_04_05-08 | 노놉-05 |
| NNOOPP_01_04_05-08 | 노놉-06 |
| NNOOPP_01_04_05-08 | 노놉-07 |
| NNOOPP_01_04_05-08 | NNOOPP-08 |
| QQRRSS_09_11_13_14 | QQRRSS_09 |
| QQRRSS_09_11_13_14 | QQRRSS_11 |
| QQRRSS_09_11_13_14 | QQRRSS_13 |
| QQRRSS_09_11_13_14 | QQRRSS_14 |
데이터 테이블스크립팅Re: 열의 문자열을 구문 분석하고 다른 열 채우기이를 수행하기 위해 Lag(또는 JSL으로 스크립트)를 사용하여 공식을 작성할 수 있지만 대화식으로 이를 시도할 수도 있지만 몇 단계가 필요합니다.
1. ProductName 열 선택
2. Cols/Utilities/Text To 열로 이동하고 - 및 _를 구분 기호로 사용합니다.

3. 테이블 및 스택으로 이동하여 스택 열 선택에 첫 번째 열 외에 다른 모든 항목을 추가합니다.


5. 레이블 열 제거
6. 남은 두 열을 모두 선택하고 행 / 행 선택 / 중복 행 선택으로 이동하여 해당 행을 삭제합니다.

7. 값이 비어 있는 셀 하나를 선택하고 일치하는 셀 선택을 선택하고 해당 행을 삭제합니다.
8. 이제 열을 모두 선택하고 열 머리글을 마우스 오른쪽 버튼으로 클릭하고 수식을 만듭니다.

9. 방금 만든 수식을 열고 , 를 _로 변경합니다.

10. 열/수식 이름 바꾸기 및 삭제
11. 필요한 경우 ProductName 거기, 나처럼 첫 번째 단계에서 실수로 삭제하지 않으면 거기에 보관할 수 있어야합니다.

일련 번호에 따라 - 또는 _가 필요한 경우 연결 수식에서 처리할 수 있습니다.
편집: 나는 질문을 조금 더 정확하게 확인했고 이것은 내가 여기에 보여준 것보다 조금 더 복잡합니다. 일련 번호 중 일부는 숫자 사이에 있기 때문에 계산을 추가해야 합니다. 중복이 제거되면 일부 행이 제거되기 때문에 이 솔루션은 작동하지 않습니다.
Re: 열의 문자열을 구문 분석하고 다른 열 채우기안녕하세요 @cchueng ,
몇 가지 방법이 있습니다. 일부는 스크립팅 기반(예를 들어 제안하는 누군가로부터 답장을 찾음)이거나 텍스트에서 열로의 연속 라운드를 사용할 수 있습니다(예는 여기에서 찾을 수 있음) 해결: 열의 텍스트를 여러 열로 분할하려면 어떻게 해야 합니까? - JMP 사용자 커뮤니티) 그런 다음 원하는 열을 선택하여 연결한 다음 열 수식을 사용하거나 선택한 열 중 하나를 마우스 오른쪽 버튼으로 클릭한 후 새 수식 열 옵션을 사용할 수 있습니다. concat에 대한 문자 옵션을 찾으십시오.열 수식은 더 유연하고 많은 옵션을 제공하며 이 항목에 대한 도움말을 참조하십시오( JMP에서 수식 생성 )
나는 그것이 당신에게 어떤 방향을 제시하기를 바랍니다.
최상의,
Re: 열의 문자열을 구문 분석하고 다른 열 채우기@jthi ,
당신은 그것에 대해 나를 때렸다.
설명도 더 자세하게 해주시고 제가 생각했던 부분이기도 하구요.
Re: 열의 문자열을 구문 분석하고 다른 열 채우기오, 당신의 권리. -는 범위로 해석되고 _는 항목의 실제 구분 기호로 해석됩니다.
Re: 열의 문자열을 구문 분석하고 다른 열 채우기감사하지만 대화형 구분 기호보다 jsl을 선호합니다. 귀하의 방법은 일련 번호가 09-12. 아래와 같은 행을 출력해야 합니다. AABBCC-09 및 AABBCC-12뿐만이 아닙니다. "-"는 범위를 의미하는 "to"를 의미합니다. 따라서 09-12는 09, 10, 11, 12를 의미합니다.
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
Re: 열의 문자열을 구문 분석하고 다른 열 채우기알겠습니다. 작동할 수 있습니다. For Each 사용으로 인해 JMP16이 필요합니다(다른 버전의 경우 For로 대체 가능. 이것은 주석이 거의 또는 전혀 없는 스크립팅된 솔루션이며 작동하려면 특정 시작 테이블이 필요합니다(OUTPUT 열 필요).
Names Default To Here(1);
dt = New Table("Untitled 4993",
Add Rows(32),
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
),
New Column("OUTPUT",
Character(16),
"Nominal",
Set Values({"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""})
)
);
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd,
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges,
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
dt[0,"OUTPUT"] = valList;JMP 고유의 패턴 매칭으로 이와 같은 작업을 "쉽게" 수행할 수 있는지 궁금합니다. @Craige_Hales
Re: 열의 문자열을 구문 분석하고 다른 열 채우기안녕하세요 크리스,
ProductName의 일부를 처리하고 때때로 잘못 구문 분석하는 스크립트가 있습니다. 지금까지 작동하지 않는 ProductNames를 처리하기 위해 코드를 검토하고 추가할 수 있습니까?
아래 예에서 작동합니다.
EEFFGG_02
헉헉_01-07
KKLLLMM_01-03_05-08
아래 예에서는 아직 작동하지 않습니다.
AABBCC_07-08_13
NNOOPP_01_04_05-08
QQRRSS_09_11_13_14
dt=current data table();
(dt << New Column( "ProductID", Character )) << Set Selected;
(dt << New Column( "OUTPUT", Character )) << Set Selected;
//Parse string in ProductName column
For Each Row(
dt,
//Assign the ProductID value
:ProductID = Word( 1, :ProductName, "_-" ); //"_"
//If the ProductName changes, capture the start and end
If( :ProductName != Lag( :ProductName, 1 ),
start = Num( Word( 2, :ProductName, "_-" ) );
end = Num( Word( 3, :ProductName, "_-" ) );
);
//Assign the OUTPUT value
:OUTPUT = :ProductID || "-" || Repeat( "0", 2 - Length( Char( start ) ) ) || Char( start );
//After end value & there is an _, set start to value after _
If( start == end & Contains( :ProductName, "_"),
start = Num( Word(-2, :ProductName, "_-" ) ),
start++);
);
Re: 열의 문자열을 구문 분석하고 다른 열 채우기안녕하세요 jthi님
스크립트에 감사하지만 내 테이블은 실제로 동적입니다. 매일 다른 날짜 범위의 데이터베이스에서 이 테이블을 가져오면 다른 ProductName 집합이 나타납니다. 따라서 항상 32행은 아닙니다. 스크립트가 거의 작동할 수 있지만 배열 크기를 해결할 수 있습니까? 감사 해요.
Re: 열의 문자열을 구문 분석하고 다른 열 채우기상당히 쉬워야 합니다. 가져온 데이터에 일련 번호만큼 많은 행이 있습니까?
Re: 열의 문자열을 구문 분석하고 다른 열 채우기안녕하세요 jthi님
예, 행 수가 일련 번호의 수와 일치했습니다.
Re: 열의 문자열을 구문 분석하고 다른 열 채우기그렇다면 이미 처리할 수 있어야 합니다. 나는 약간의 수정을 했습니다(없는 경우 OUTPUT 열 생성). 현재 데이터 테이블이 ProductNames별로 정렬되어 있다는 사실에 의존하고 있으며, 이로 인해 어느 시점에서 문제가 발생할 수 있습니다. 그런 다음 입력 테이블이 정렬되었는지 확인할 수 있습니다(가장 쉬운 솔루션).
ProductNames가 있는 uniqProd라는 목록 변수가 있는 한 데이터 테이블 없이도 For Each 부분을 사용할 수 있어야 합니다. 그 다음은 데이터 테이블에 값을 추가하는 방법을 알아내는 것입니다.
Names Default To Here(1);
//Test table
/*
dt = New Table("Untitled 4993",
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
)
);
*/
dt = Current Data Table();
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd, //loop for each ProductName
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges, //Loop for serialnumber inside the ProductName
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
//if starting table doesn't have OUTPUT column create it
If(!Contains(dt << Get Column Names("String"), "OUTPUT"),
dt << New Column("OUTPUT", Character, "Nominal");
);
//dt[0,"OUTPUT"] = valList; subscripting, maybe a bit more difficult to understand
dt:OUTPUT << Set Values(valList);
스크립트가 수행하려고 하는 단순화된 버전:
1. 스크립트는 ProductName 열의 모든 고유 값을 가져옵니다.
2. For Each 루프의 두 부분에 있는 각 루프에 대한 스크립트 루프
3. 첫 번째 루프는 고유한 값을 반복하고 제품과 숫자 부분으로 나눕니다.
4. 그런 다음 일련 번호 부분을 다시 반복하여 단일 값으로 분할합니다. 이 단일 값은 Product 부분과 연결되고 문자열이 valList 목록에 삽입됩니다(이 4.는 여기에서 설명한 것처럼 간단하지 않습니다).
5. 두 루프가 모두 끝나면 가능한 모든 일련 번호가 포함된 목록이 있어야 합니다. 제품 부분은 알파벳 순입니다.
6. 이 목록이 있으면 OUTPUT에 추가되고, 없으면 먼저 생성됩니다.
Re: 열의 문자열을 구문 분석하고 다른 열 채우기안녕하세요 jthi님
내 ProductName이 문자와 숫자가 혼합된 경우 스크립트가 작동하지 않습니다. 테이블을 부착했습니다. 이것이 내 productName의 대부분이 어떻게 생겼는지입니다. 도와주셔서 감사합니다.