Excel - FILTERXML을 사용하여 문자열에서 하위 문자열 추출
배경
최근에는 구분된 문자열을 XML로 변경하여 Excel로 해석하고 관심 있는 하위 문자열을 검색한다는 개념에 익숙해지려고 노력하고 있습니다.이 기능은 Excel 2013부터 제공되었으며 Mac용 Excel 및 Excel Online에서는 사용할 수 없습니다.
구분된 문자열은 구분자로 공백을 사용하거나 문자열 내의 하위 문자열을 정의하기 위해 사용할 수 있는 다른 문자 조합을 의미합니다.예를 들어 다음과 같이 가정합니다.
ABC|123|DEF|456|XY-1A|ZY-2F|XY-3F|XY-4f|xyz|123
질문.
많은 사람들이 n번째 요소를 얻는 방법을 알고 있습니다(예: =TRIM(MID(SUBSTITUTE(A1,"|",REPT(" ",LEN(A1))),3*LEN(A1)+1,LEN(A1)))
456
""를 포함한 기타 LEN()
,MID()
,FIND()
그 구성에서는 할 수 요?FILTERXML
해당 서브스트링을 추출하고 전체 스트링을 청소하기 위해 보다 구체적인 기준을 사용할 수 있습니까?" " " , " " : " :
- 위치별 요소
- 숫자 또는 숫자 이외의 요소
- 서브스트링 자체를 포함하는 요소
- 서브스트링으로 시작하거나 끝나는 요소
- 대소문자 요소
- 수를 유지하는 요소
- 독자적인 가치관
- ...
의 ★★★FILTERXML
XPATH 1.0
불행하게도 우리가 원하는 만큼 다양하지 않다는 뜻이죠또한 Excel은 재작업된 노드값을 반환할 수 없는 것으로 보이며, 보기 순서대로 노드를 선택할 수 있습니다.그러나 여전히 활용할 수 있는 기능은 상당히 많습니다.이에 대한 자세한 내용은 여기를 참조하십시오.
는 두 매개 변수를 . 즉, ㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴ.=FILTERXML(<A string in valid XML format>,<A string in valid XPATH format>)
라고 칩시다A1
에는 다음과 같은.ABC|123|DEF|456|XY-1A|ZY-2F|XY-3F|XY-4f|xyz|123
하려면 , 「XML」을 사용합니다SUBSTITUTE
end-tag 、 start-tag 、 start-tag 、 ----다다다다다다다다다다-----.따라서 주어진 예에 대해 유효한 XML 구성을 얻으려면 다음을 수행합니다.
"<t><s>"&SUBSTITUTE(A1,"|","</s><s>")&"</s></t>"
가독성을 위해 위의 구문을 플레이스 홀더라는 단어로 참조합니다.아래에는 다양한 유용한 기능이 있습니다.XPATH
유효한 구조에서 노드를 필터링하기 위한 함수:
1) 모든 요소:
=FILTERXML(<XML>,"//s")
품::ABC
,123
,DEF
,456
,XY-1A
,ZY-2F
,XY-3F
,XY-4f
,xyz
★★★★★★★★★★★★★★★★★」123
노드모든 노드)
2) 위치별 요소:
=FILTERXML(<XML>,"//s[position()=4]")
또는 다음 중 하나를 선택합니다.
=FILTERXML(<XML>,"//s[4]")
품::456
) (4의 노드)†
=FILTERXML(<XML>,"//s[position()<4]")
품::ABC
,123
★★★★★★★★★★★★★★★★★」DEF
< ( < 4 )
=FILTERXML(<XML>,"//s[position()=2 or position()>5]")
품::123
,ZY-2F
,XY-3F
,XY-4f
,xyz
★★★★★★★★★★★★★★★★★」123
2 5('2' > '5')
=FILTERXML(<XML>,"//s[last()]")
품::123
인덱스의 )('노드
=FILTERXML(<XML>,"//s[position() mod 2 = 1]")
품::ABC
,DEF
,XY-1A
,XY-3F
★★★★★★★★★★★★★★★★★」xyz
노드홀수 노드)
=FILTERXML(<XML>,"//s[position() mod 2 = 0]")
품::123
,456
,ZF-2F
,XY-4f
★★★★★★★★★★★★★★★★★」123
노드노드)
3) (비) 숫자 요소:
=FILTERXML(<XML>,"//s[number()=.]")
또는 다음 중 하나를 선택합니다.
=FILTERXML(<XML>,"//s[.*0=0]")
품::123
,456
, , , , 입니다.123
노드스위치 노드)
=FILTERXML(<XML>,"//s[not(number()=.)]")
또는 다음 중 하나를 선택합니다.
=FILTERXML(<XML>,"//s[.*0!=0)]")
품::ABC
,DEF
,XY-1A
,ZY-2F
,XY-3F
,XY-4f
★★★★★★★★★★★★★★★★★」xyz
노드비표준 노드')
4) 다음을 포함하는 요소:
=FILTERXML(<XML>,"//s[contains(., 'Y')]")
품::XY-1A
,ZY-2F
,XY-3F
★★★★★★★★★★★★★★★★★」XY-4f
('Y' 함, 알))XPATH
단, 대소문자를 구분하지 않습니다.xyz
)
=FILTERXML(<XML>,"//s[not(contains(., 'Y'))]")
품::ABC
,123
,DEF
,456
,xyz
★★★★★★★★★★★★★★★★★」123
('Y' 、 'Y' 、 'Y' )XPATH
합니다.xyz
)
5) 시작 또는 종료가 다음과 같은 요소:
=FILTERXML(<XML>,"//s[starts-with(., 'XY')]")
품::XY-1A
,XY-3F
★★★★★★★★★★★★★★★★★」XY-4f
'로 시작)
=FILTERXML(<XML>,"//s[not(starts-with(., 'XY'))]")
품::ABC
,123
,DEF
,456
,ZY-2F
,xyz
★★★★★★★★★★★★★★★★★」123
XY')로
=FILTERXML(<XML>,"//s[substring(., string-length(.) - string-length('F') +1) = 'F']")
품::DEF
,ZY-2F
★★★★★★★★★★★★★★★★★」XY-3F
, ('F'로 끝남, 알림)XPATH 1.0
에서는, ★★★★★★★★★★★를 서포트하고 않습니다.ends-with
)
=FILTERXML(<XML>,"//s[not(substring(., string-length(.) - string-length('F') +1) = 'F')]")
품::ABC
,123
,456
,XY-1A
,XY-4f
,xyz
★★★★★★★★★★★★★★★★★」123
=FILTERXML(<XML>,"//s[starts-with(., 'X') and substring(., string-length(.) - string-length('A') +1) = 'A']")
품::XY-1A
하여 '로)
6) 대소문자 요소:
=FILTERXML(<XML>,"//s[translate(.,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')=.]")
품::ABC
,123
,DEF
,456
,XY-1A
,ZY-2F
,XY-3F
★★★★★★★★★★★★★★★★★」123
노드스위치 노드)
=FILTERXML(<XML>,"//s[translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')=.]")
품::123
,456
,xyz
★★★★★★★★★★★★★★★★★」123
노드스위치 노드)
메모: 유감스럽지만XPATH 1.0
에서는, ★★★★★★★★★★★를 서포트하고 않습니다.upper-case()
않다lower-case()
,,, 피회니다다다회이치
7) 숫자를 포함하지 않는 요소:
=FILTERXML(<XML>,"//s[translate(.,'1234567890','')!=.]")
품::123
,456
,XY-1A
,ZY-2F
,XY-3F
,XY-4f
★★★★★★★★★★★★★★★★★」123
('임의의 자리수')
=FILTERXML(<XML>,"//s[translate(.,'1234567890','')=.]")
품::ABC
,DEF
★★★★★★★★★★★★★★★★★」xyz
하지 않음) (숫자 없음)
=FILTERXML(<XML>,"//s[translate(.,'1234567890','')!=. and .*0!=0]")
품::XY-1A
,ZY-2F
,XY-3F
★★★★★★★★★★★★★★★★★」XY-4f
하지 않음 (숫자 자체는 유지하지 않음)
8) 고유 요소 또는 중복:
=FILTERXML(<XML>,"//s[preceding::*=.]")
품::123
노드스위치 노드)
=FILTERXML(<XML>,"//s[not(preceding::*=.)]")
품::ABC
,123
,DEF
,456
,XY-1A
,ZY-2F
,XY-3F
,XY-4f
★★★★★★★★★★★★★★★★★」xyz
노드스위치 노드)
=FILTERXML(<XML>,"//s[not(following::*=. or preceding::*=.)]")
품::ABC
,DEF
,456
,XY-1A
,ZY-2F
,XY-3F
★★★★★★★★★★★★★★★★★」XY-4f
형제가 )
9) 일정 길이의 요소:
=FILTERXML(<XML>,"//s[string-length()=5]")
품::XY-1A
,ZY-2F
,XY-3F
★★★★★★★★★★★★★★★★★」XY-4f
(5글자)
=FILTERXML(<XML>,"//s[string-length()<4]")
품::ABC
,123
,DEF
,456
,xyz
★★★★★★★★★★★★★★★★★」123
(4글자 이상)
10) 전/후를 기준으로 하는 요소:
=FILTERXML(<XML>,"//s[preceding::*[1]='456']")
품::XY-1A
456')
=FILTERXML(<XML>,"//s[starts-with(preceding::*[1],'XY')]")
품::ZY-2F
,XY-4f
, , , , 입니다.xyz
는 'XY)로 합니다).
=FILTERXML(<XML>,"//s[following::*[1]='123']")
품::ABC
, , , , 입니다.xyz
는 ' ('123')
=FILTERXML(<XML>,"//s[contains(following::*[1],'1')]")
품::ABC
,456
, , , , 입니다.xyz
에는 '1')이 포함되어 있습니다).
=FILTERXML(<XML>,"//s[preceding::*='ABC' and following::*='XY-3F']")
또는 다음 중 하나를 선택합니다.
=FILTERXML(<XML>,"//s[.='ABC']/following::s[following::s='XY-3F']")
품::123
,DEF
,456
,XY-1A
★★★★★★★★★★★★★★★★★」ZY-2F
('ABC 사이의 것
11) 서브스트링에 근거한 요소:
=FILTERXML(<XML>,"//s[substring-after(., '-') = '3F']")
품::XY-3F
뒤에 ' ('3F'로 끝나는 노드)
=FILTERXML(<XML>,"//s[contains(substring-after(., '-') , 'F')]")
품::ZY-2F
★★★★★★★★★★★★★★★★★」XY-3F
뒤에 'F'를 포함하는 노드)
=FILTERXML(<XML>,"//s[substring-before(., '-') = 'ZY']")
품::ZY-2F
앞에 'ZY'로 시작하는 노드)
=FILTERXML(<XML>,"//s[contains(substring-before(., '-'), 'Y')]")
품::XY-1A
,ZY-2F
,XY-3F
★★★★★★★★★★★★★★★★★」XY-4f
앞에 'Y'를 포함하는 노드)
12) 연결 기준 요소:
=FILTERXML(<XML>,"//s[concat(., '|', following::*[1])='ZY-2F|XY-3F']")
품::ZY-2F
되어 있고 는 ''(')와 같습니다)|'는 'ZY-2F|XY-3F'입니다).
=FILTERXML(<XML>,"//s[contains(concat(., preceding::*[2]), 'FA')]")
품::DEF
시 는 'FA')
13) 비어있거나비어 있지 않음:
=FILTERXML(<XML>,"//s[count(node())>0]")
또는 다음 중 하나를 선택합니다.
=FILTERXML(<XML>,"//s[node()]")
품::ABC
,123
,DEF
,456
,XY-1A
,ZY-2F
,XY-3F
,XY-4f
,xyz
★★★★★★★★★★★★★★★★★」123
모든 )('비어 있지 않은 노드')
=FILTERXML(<XML>,"//s[count(node())=0]")
또는 다음 중 하나를 선택합니다.
=FILTERXML(<XML>,"//s[not(node())]")
반품:없음(빈 노드 모두)
14) 전 또는 후:
=FILTERXML(<XML>,"//s[substring(., string-length(.) - string-length('F') +1) = 'F'][last()]/following::*")
품::XY-4f
,xyz
★★★★★★★★★★★★★★★★★」123
('F'로 끝나는 마지막 노드의 오른쪽에 있는 모든 노드)
=FILTERXML(<XML>,"//s[substring(., string-length(.) - string-length('F') +1) = 'F'][1]/preceding::*")
품::ABC
★★★★★★★★★★★★★★★★★」123
(첫 번째 노드 왼쪽에 있는 대문자 'F'로 끝나는 모든 노드)
15) (선행 또는 후행) 및 자기:
=FILTERXML(<XML>,"(//s[.*0!=0][last()]|//s[.*0!=0][last()]/preceding::*)")
품::ABC
,123
,DEF
,456
,XY-1A
,ZY-2F
,XY-3F
,XY-4f
★★★★★★★★★★★★★★★★★」xyz
)(' 숫자노드 표시')††
=FILTERXML(<XML>,"(//s[.*0=0][1]|//s[.*0=0][1]/following::*)")
품::123
,DEF
,456
,XY-1A
,ZY-2F
,XY-3F
,XY-4f
,xyz
★★★★★★★★★★★★★★★★★」123
모든 비노드 삭제')
16) 최대 또는 최소:
=FILTERXML(<XML>,"(//s[.*0=0][not(.<//s[.*0=0])])[1]")
품::456
노드를 )('수치')
=FILTERXML(<XML>,"(//s[.*0=0][not(.>//s[.*0=0])])[1]")
품::123
노드를 )('수치')
메모: 이는 #3에 따라 모든 숫자 노드를 반환하고 Excel을 사용하여 어레이를 후처리하는 것과 같습니다.MIN()
★★★★★★★★★★★★★★★★★」MAX()
★★★★★★★★★★★★★★★★★★.
위는 분명히 다음 예와 같은 가능성을 보여 줍니다.XPATH 1.0
위의 다양한 기능을 조합하여 사용할 수 있습니다.저는 가장 많이 사용되는 현악기 기능을 다루려고 노력했습니다.부족한 것이 있으면 언제든지 코멘트를 주세요.
는 상당히 하지만, .FILTERXML
문의하실 수 있습니다.이 수식은 다른 방법으로 사용할 노드의 배열을 반환합니다.많은 시간 동안 그것을 사용하곤 했어요.TEXTJOIN()
★★★★★★★★★★★★★★★★★」INDEX()
하지만 다른 옵션은 결과를 유출하는 새로운 DA 기능이 될 것입니다.
" " " 에서 할 때는 .FILTERXML()
앰퍼샌드 문자(&)와 왼쪽 꺽쇠 괄호(<)는 리터럴 형식으로 표시할 수 없습니다.각각 다음 중 하나로 대체해야 합니다.&
★★★★★★★★★★★★★★★★★」<
또 다른 옵션은 ISO/IEC 10646 문자 코드를 사용하는 것입니다.&
★★★★★★★★★★★★★★★★★」<
각각 다음과 같다.해석 후, 함수는 이러한 문자를 리터럴 형식으로 반환합니다.세미콜론으로 줄을 쪼개는 것은 말할 필요도 없이 까다로워졌다.
‡개폐 각 괄호 사이의 구조인 각 술어는 주어진 노드리스트의 필터입니다.이러한 구조를 여러 개 쓰는 것은 사실 그러한 술어를 쓰는 것이다.
‡‡형제자매와 자기 자신보다 앞서가는 것은 쉬운 일이 아닙니다.그래서 나는 유니온 연산자를 이용했다.단, 이 경우 여러 개의 표현이 파라테시스 안에 있어야 합니다.정규 표현식에 대해 생각해 보면 캡처 그룹 내의 대체 표현과 매우 유사합니다.
편집 22-3-2022:
「 」에 .TEXTSPLIT()
이제 문자열을 수평 또는 수직 범위(또는 둘 다)로 똑바로 분할할 수 있습니다.값 배열로 분할할 수도 있습니다.'xpath'라고 합니다.따라서 아래 답변은 관련성이 있으므로 그대로 유지하겠습니다.
행방불명SPLIT()
할 수 위해 더 하게 쓴 입니다.SPLIT()
사용하여 FILTERXML()
VBA를 사용하다이지만 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★」LAMBDA()
이 기능을 통해 독자적인 커스텀 기능을 만들 수 있습니다.이치노
「 」의 C1
말하면=SPLIT(A1,B1:B3,"")
구분된 텍스트 값을 모양 순서대로 흘립니다., <고객명>님SPLIT()
회사 이름이에요.LAMBDA()
" managername manager"에서:
=LAMBDA(txt,del,xpath,FILTERXML("<t><s>"&REDUCE(txt,del,LAMBDA(a,b,SUBSTITUTE(a,b,"</s><s>")))&"</s></t>","//s"&xpath))
보시다시피 이 기능에는 4개의 파라미터가 있습니다.
txt
. - 소스 값 - 소스 값.del
- 구분해 주세요. - 구분해 주세요.작성 또는 참조.xpath
에 따라 를 적용하기 xpath 표현이다. ::"[.*0=0]"
숫자 하위 문자열만 반환합니다.FILTERXML("<t><s>"&REDUCE(txt,del,LAMBDA(c,d,SUBSTITUTE(c,d,"</s><s>")))&"</s></t>","//s"&xpath)
네 번째 파라미터는 앞의 3가지 파라미터가 모두 호출되어 메인포스트에서 설명한 것과 같은 구문을 작성합니다.가 스스로 않기 인 「MS」, 「MS」, 「」를 작성했습니다.SPLIT()
3번으로 나누다
는 <고객명>에 집중되어 .SUBSTITUTE()
파이프 교환하지만 여러 개의 구분 기호가 있으면 어떻게 될까요? 여러 개의 네스트된 것이 SUBSTITUTE()
하죠? 이 기능을 하면 좋지 요?SPLIT()
? 가 기?LAMBDA()
이 기능을 재귀적으로 호출할 수 있고 MS는 이 기능을 수행하는 람다 관련 함수까지 생각해냈기 때문에 개인적으로 매우 흥미롭습니다.REDURE().이 함수는 이제 모든 딜리미터가 중첩된 부분을 통과할 때까지 모든 딜리미터를 반복적으로 처리합니다.LAMBDA()
!
, 이제 만의 것을 냈습니다.SPLIT()
다음 세 가지 매개 변수를 사용하여 기능을 수행합니다.
=SPLIT(<StringToBeSplited>,<YourDelimiters>,<OptionalXpath>)
이제 이 기능을 전체 워크북의 함수로 사용할 수 있습니다.맛있게 드세요!
언급URL : https://stackoverflow.com/questions/61837696/excel-extract-substrings-from-string-using-filterxml
'programing' 카테고리의 다른 글
SQL Server에서 특정 테이블에 대한 CREATE TABLE 문을 생성하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
---|---|
패스워드 없이 다른 사용자로 스크립트를 실행하는 방법 (0) | 2023.04.11 |
임시 테이블에 데이터 삽입 (0) | 2023.04.11 |
소수점 두 자리만 표시되도록 플로트 만들기 (0) | 2023.04.11 |
MVVM WPF 프로젝트의 DataGrid에서 여러 항목 선택 (0) | 2023.04.11 |