특정 내용을 찾기 위해 한 열의 모든 셀을 검색합니다.안녕하세요 여러분,
각 행에 서로 다른 문자열이 포함된 열이 있는 jmp 데이터 테이블이 있습니다. 해당 열을 반복하여 해당 셀에 있는 문자열의 특정 부분을 찾을 수 있는지 알고 싶습니다.
다음은 문자열의 예입니다.
클래스: 10 테이블:15 Stat:NA loc:NA Teacher:Sam --> 셀 내용
수업: 11 테이블:11 통계:NA loc:NA 교사:Sam
문제는 클래스 번호와 테이블 번호가 다르다는 것입니다. 그러나 "클래스: #"으로 시작하는 셀을 찾고 나머지 셀을 목록으로 가져오기만 하면 됩니다.
그래서 내 질문은: 특정 열에서 부분 셀 검색을 수행할 수 있습니까?
자동화 및 스크립팅기본 데이터 분석 및 모델링Re: 특정 내용을 찾기 위해 한 열의 모든 셀을 검색합니다.이것은 이것을 처리하는 한 가지 가능한 방법입니다
Names Default To Here( 1 );
dt = Current Data Table();
foundList = {};
For Each Row(
If(
Word( 1, thestringcolumn, " " ) & Is Missing(
Num( word * 2, thestringcolumn, " " )
) == 0,
Insert Into(
foundList,
Substr(
thestringcolumn,
Length( Word( 1, thestringcolumn, " " ) )
+Length( Word( 2, thestringcolumn, " " ) ) + 2
)
)
)
);Re: 특정 내용을 찾기 위해 한 열의 모든 셀을 검색합니다.문자열 형식에 따라 Recode를 사용할 수도 있습니다(일치 항목이 선택되지 않은 경우 텍스트 유지에 유의하세요).

또는 For Each Row를 사용하는 스크립트. For Each Row를 사용하는 경우 문자열 구문 분석 및 결과 저장 방법에 대한 다양한 옵션이 있습니다. 아래는 또 다른 예입니다.
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(2),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{"Class: 10 Table:15 Stat:NA loc:NA teacher:Sam",
"Class: 11 Table:11 Stat:NA loc:NA teacher:Sam"}
)
)
);
result = {};
For Each Row(dt,
res = Regex(:Column 1, "^(Class: \d+) (.*)?", "\2");
If(!IsMissing(res),
Insert Into(result, res);
);
);
show(result);
// result = {"Table:15 Stat:NA loc:NA teacher:Sam", "Table:11 Stat:NA loc:NA teacher:Sam"};Re: 특정 내용을 찾기 위해 한 열의 모든 셀을 검색합니다.@jthi 감사합니다. 이는 위에서 제공한 예에 완벽하게 작동합니다.
후속 질문이 있습니다. 다음과 같은 문자열 목록이 있다고 가정해 보겠습니다.
10::클래스: A
11::클래스: A1
12::클래스: A2
..
20::클래스 B
21::클래스 B1
22::클래스 B1
30::클래스 C
31::클래스 C1
32::클래스 C2
각 수업에 대한 목록을 만들고 싶다고 가정해 보겠습니다. 나는 첫 번째가 ClassAList = (11::Class: A ,11::Class: A ,11::Class: A );
문자열에서 선행 숫자를 찾은 다음 해당 목록으로 이동하기 위해 regex()를 수정해 보았습니다. 나는 다음과 같은 것을 사용했습니다: Regex("10:::Class" , "[1]")
여기서 문제는 모든 문자열에서 [1]을 찾고 있다는 것입니다. 정규식이 일치 항목을 찾아야 하는 인덱스를 선택할 수 있습니까?
여기서 또 다른 문제는 전체 문자열이 아닌 1만 반환한다는 것입니다.
어떤 지침이라도 감사하겠습니다.
Re: 특정 내용을 찾기 위해 한 열의 모든 셀을 검색합니다.이것은 당신이 무엇을 할 수 있는지에 대한 아이디어를 줄 수 있습니다
Names Default To Here(1);
mylist = {"10::Class: A", "11::Class: A1", "12::Class: A2", "20::Class B", "21::Class B1",
"22::Class B1", "30::Class C", "31::Class C1", "32::Class C2"};
class_pattern = "\d+::(Class:? [A-Z])";
aa = Associative Array();
For Each({myitem}, mylist,
res = Regex(myitem, class_pattern, "\1");
If(!Contains(aa, res),
aa[res] = {};
);
Insert Into(aa[res], myitem);
);
show(aa);
정규식 패턴에 대한 설명은 https://regex101.com/r/itqqww/1
Re: 특정 내용을 찾기 위해 한 열의 모든 셀을 검색합니다.@jthi 감사합니다. 이것은 완벽하게 작동합니다.
후속 질문:
첫 번째 숫자만을 기준으로 목록을 하위 그룹으로 그룹화하고 싶습니다. 이를 위해 정규식 앵커를 사용하려고 했습니다. 그러나 첫 번째 숫자만 일치하는 대신 첫 번째 숫자와 그 뒤에 오는 모든 숫자가 일치합니다. 어떤 지침이라도 감사하겠습니다.
Re: 특정 내용을 찾기 위해 한 열의 모든 셀을 검색합니다.클래스 B1 부품을 말씀하시는 건가요? \d?를 추가하여 정규식을 수정할 수 있습니다. 괄호 안에 ( https://regex101.com/r/Yfh6pZ/1 ). \d는 숫자와 일치하고 ? 0번 또는 1번 이전의 토큰과 일치합니다. 숫자가 없는 그룹을 캡처하지 않으려면 ? 또는 {1}로 바꾸세요.

[
"Class B" => {"20::Class B"},
"Class B1" => {"21::Class B1", "22::Class B1"},
"Class C" => {"30::Class C"},
"Class C1" => {"31::Class C1"},
"Class C2" => {"32::Class C2"},
"Class: A" => {"10::Class: A"},
"Class: A1" => {"11::Class: A1"},
"Class: A2" => {"12::Class: A2"}
]