Excel

문자열 중 원문자 지우기(4) - Scan, Reduce

별동산 2024. 5. 14. 08:35
반응형

이번에는 Reduce와 Scan 함수를 이용해 원문자를 제거해 보겠습니다.

 

원문자삭제문의(완성)3.xlsx
0.02MB

 

 

1. Reduce 함수를 이용한 수식

가. Reduce 함수의 구문

=REDUCE([initial_value], array, lambda(accumulator, value))

initial_value는 초기값, array는 배열, 

accumulator는 initial_value와 array를 받는 것이고,

value는 accumulator를 이용해서 값을 구하는 수식입니다.

 

나. 원문자가 아니라면 한 글자씩  결합

A2셀을 대상으로 A22셀에서 수식을 작성하겠습니다.

 

먼저 초기값은 문자열을 결합할 것이므로 ""으로 해야 합니다. 비워두면 0으로 생각해서 이상한 값이 나옵니다.

 

array는 배열인데, 글자를 한 글자씩 구분하기 위해 1부터 해당 셀의 길이만큼 숫자를 배열로 넘깁니다.

 

그리고, lambda 수식을 작성하는데,

초기값은 s로 받고, array는 c로 받습니다.

 

그리고, value는 한 글자씩 Unicode가 9331보다 큰 지 판단해서 크다면 문자열을 결합하고,

아니면 그 값, 다시 말해 초기값 또는 결합한 값을 유지하도록 합니다.

 

따라서, 전체 수식은

=reduce("",sequence(len(a2)),lambda(s,c,if(unicode(mid(a2,c,1))>9331,s&mid(a2,c,1),s)))

s값은 A2셀을 한 글자씩 처리할 때마다 만, 만둣, 만둣국을 바뀝니다.

 

 

이제 A22셀의 수식을 복사해서 A22셀에서 U26셀까지 붙여 넣습니다.

 

이전과 마찬가지로 셀에 값이 없을 때 에러가 발생하므로

=다음에 iferror(를 추가하고, 맨 뒤에 ,"")를 추가하면 됩니다.

=IFERROR(REDUCE("",SEQUENCE(LEN(A2)),LAMBDA(s,c,IF(UNICODE(MID(A2,c,1))>9331,s&MID(A2,c,1),s))),"")

 

모든 셀에서 원문자가 제거되었습니다.

 

U5셀과 같이 중간에 원문자가 들어가 있어도 문제없이 잘 처리됐습니다.

 

 

 

2. Scan과 Reuce 함수를 결합한 수식

가. Scan 함수의 구문

=SCAN ([initial_value], array, lambda(accumulator, value))

구문은 Reduce와 똑같습니다.

 

나. 모든 범위를 한꺼번에 처리

Scan함수를 사용하려고 하는 이유는

위 수식에서는 한 셀만 처리했기 때문에 A2셀부터 U6셀까지 한꺼번에 처리하기 위한 것입니다.

 

Scan으로 초기값과 범위를 모두 넘긴 다음 Reduce에서 한 셀씩 처리하는 것입니다.

따라서,  위 수식=IFERROR(REDUCE("",SEQUENCE(LEN(A2)),LAMBDA(s,c,IF(UNICODE(MID(A2,c,1))>9331,s&MID(A2,c,1),s))),"")

에서 A2 자리에 Scan으로 받은 범위를 넘기면 됩니다. 초기값을 Reduce함수에서 지정하므로 Scan함수의 초기값은 의미가 없습니다.

 

수식은

=scan("",a2:u6,lambda(ss,cc, IFERROR(REDUCE("",SEQUENCE(LEN(cc)),LAMBDA(s,c,IF(UNICODE(MID(cc,c,1))>9331,s&MID(cc,c,1),s))),"")))

입니다.

 

scan함수의 ""는 s와 c가 있으므로 ss로 받고,

a2:u6은 cc로 받고,

A2를 모두 cc로 바꾼 것입니다.

 

그러면 A2셀에서 U6셀까지 한 셀씩 원문자가 아닌 경우만 결합해서 결괏값을 반환합니다.

그러면 수식을 A27셀에만 입력했는데, U31셀까지 모두 처리됩니다.

A27셀부터 U31셀까지가 파란색 실선으로 둘러싸여져 있습니다.

 

원문자삭제문의(완성)4.xlsx
0.02MB

반응형