XML 구문 분석 도움말모두,
이것은 포럼의 다른 질문과 관련이 있습니다( https://community.jmp.com/t5/Discussions/Can-JMP-Support-Excel-Formatting-through-JSL/mp/86355#M38495 ) . 정말 큰 XML 파일(Excel 워크시트의 XML)의 작은 하위 집합을 제공하고 있습니다. 대상 요소에 효율적으로 도달하기 위해 XML 트리를 순회하는 방법에 대한 좋은 예를 보고 싶습니다. 누군가 여기 값에 대한 핸들을 얻기 위해 Parse XML 또는 JSL의 다른 함수를 사용하는 가장 좋은 방법이 무엇인지에 대한 좋은 예를 제공할 수 있습니까? 그리고 값을 수정하시겠습니까?
<C r="A1" s="67" t="s">
<V>0</V>
</C>
<WORKSHEET xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ignorable="x14ac" x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
<DIMENSION ref="A1:BB101473"></DIMENSION>
<SHEETVIEWS>
<SHEETVIEW showgridlines="0" tabselected="1" zoomscalenormal="100" workbookviewid="0">
<SELECTION activecell="A13" sqref="A13"></SELECTION>
</SHEETVIEW>
</SHEETVIEWS>
<SHEETFORMATPR defaultrowheight="15" dydescent="0.25"></SHEETFORMATPR>
<COLS>
</COLS>
<SHEETDATA>
<ROW r="1" ht="24">
<C r="A1" s="67" t="s">
<V>0</V>
</C>
<C r="B1" s="67"></C>
<C r="C1" s="67"></C>
<C r="D1" s="67"></C>
<C r="E1" s="67"></C>
<C r="F1" s="67"></C>
<C r="G1" s="67"></C>
<C r="H1" s="67"></C>
<C r="I1" s="67"></C>
<C r="J1" s="67"></C>
<C r="K1" s="67"></C>
<C r="L1" s="67"></C>
<C r="M1" s="67"></C>
<C r="N1" s="10"></C>
<C r="O1" s="4"></C>
<C r="P1" s="4"></C>
<C r="Q1" s="4"></C>
<C r="R1" s="27"></C>
<C r="S1" s="27"></C>
<C r="T1" s="27"></C>
</ROW>
</SHEETDATA>
</WORKSHEET>다음을 시도하고 빈 테이블을 얻었습니다.
Parse XML(xml,
On Element("sheetData",Start Tag(New Table())),
On Element( "col", End Tag( New Column( XML Attr( "row r = '1' ht ='24'" ), Set Values( Parse( XML Text() ) ) ) ) )
);Re: XML 구문 분석 도움말@gzmorgan0 ,
자세한 답변 감사합니다.
목적 : 서식이 많은 대용량 Excel 통합 문서를 가져와서 서식을 변경하지 않고 시트의 값을 편집합니다.
지금까지 본 옵션:
- R 패키지 사용(XLConnect(너무 느림) 또는 openxlsx(형식이 엉망이고 느림))
- JSL 사용
- JSL을 사용하여 서식을 유지하기 위해 지금까지 찾은 유일한 실행 가능한 옵션은 Ian의 제안, 즉 내가 하려는 Excel 통합 문서 뒤의 XML을 활용하는 것입니다.
- 다음과 같이 XPath 쿼리를 사용하는 방법이 있을 수 있습니다.
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");셀에 올바른 값을 반환하지만 전역 바꾸기를 수행하지 않고 이 값을 어떻게 바꾸느냐가 문제입니다.
- 제안한대로 Run Program과 함께 VB 스크립트를 사용하십시오.
sheet1 뒤에 있는 XML이 너무 크기 때문에(100,000줄 이상) 계층 구조를 효율적으로 드릴다운하는 방법에 대한 커뮤니티의 도움을 구하기 위해 예제를 제공하기 위해 작은 스니펫을 가져왔습니다. JSL 내에서 전체 솔루션을 유지하고 깨끗하고 효율적으로 만들고 싶었지만 XML을 수정할 다른 옵션이 없으면 다른 프로그램에 의존해야 하는 것 같습니다. 내가 놓친 다른 옵션이 있다고 생각하십니까? 이 문제를 처리하는 더 좋은 방법이 있습니까?
Re: XML 구문 분석 도움말게시물에 있는 XML 스니펫의 경우 A1 셀에만 값이 있습니다. 문자열 유형이었고 파일에서 해당 값을 가져와야 합니다. "xl/sharedStrings.xml"
Re: XML 구문 분석 도움말@uday_guntupalli 귀하의 이전 게시물과 이 이메일 문자열에서 여전히 무엇을 하려는지 확신이 서지 않습니까? Excel은 형식을 소유합니다.하나의 xml 관련 파일에서 간단히 읽어서 파일에 쓰고 압축 파일을 저장하고 Excel에서 열었을 때 손상되었다고 표시되었지만 수정 옵션을 선택하면 Excel 통합 문서에 변경된 값이 포함되어 있습니다.(어쩌면 수식 셀에 썼을까요??).
대용량 Excel 파일을 데이터베이스로 사용하여 읽고 쓰려고 합니까? 서식을 변경하려고 합니까?범위(크기, 작업, 업데이트, 행 추가, 행 삭제 등)를 포함한 특정 작업은 무엇입니까?
아래는 Big Class.jmp, Iris.jmp 및 Semiconductor Capability.jmp에서 생성된 3개의 시트 XLSX 파일에 있는 XML 파일의 스니펫입니다. 첫 번째 시트입니다.첫 번째 행이 열 이름이므로 차원에 유의할 항목은 A1:E41입니다. Tag sheetData를 찾으면 데이터가 행과 셀로 정리되어 열을 교체하기가 쉽지 않습니다.또한 문자열이 있는 셀에는 추가 코딩 t =\!"s\!" 문자열이고 값은 숫자임을 나타냅니다.해당 문자열 값이 필요한 경우 "xl/sharedStrings.xml" 파일에서 해당 문자열 값을 조회해야 합니다. 참조 번호는 0부터 시작합니다.이 간단한 3시트 Excel 파일에는 490개의 고유 문자열이 있으며 문자열 44는 "F"이고 45는 성별을 나타내는 "M"입니다.
XML을 읽고 쓰는 데 관심이 있는 경우 JSL Companion 2nd Edition의 섹션과 여러 스크립트 및 예제가 있습니다. 그러나 당신이 하려고 하는 "팅크"에 대해서는 XML로 하지 않을 것입니다.
"xl/worksheets/sheet1.xml"
"
<WORKSHEET xmlns="\!"http://schemas.openxmlformats.org/spreadsheetml/2006/main\!"" r="\!"http://schemas.openxmlformats.org/officeDocument/2006/relationships\!"" mc="\!"http://schemas.openxmlformats.org/markup-compatibility/2006\!"" ignorable="\!"x14ac" xr="" xr2="" xr3="">
<DIMENSION ref="\!"A1:E41\!"/">
<SHEETVIEWS><SHEETVIEW tabselected="\!"1\!"" workbookviewid="\!"0\!"/"></SHEETVIEW>
<SHEETFORMATPR defaultrowheight="\!"14.4\!"" dydescent="\!"0.3\!"/">
<COLS>
</COLS>
<SHEETDATA>
<ROW r="\!"1\!"" spans="\!"1:5\!"" ht="\!"18.600000000000001\!"" dydescent="\!"0.45\!"">
<C r="\!"A1\!"" s="\!"1\!"" t="\!"s\!""><V>0</V></C>
<C r="\!"B1\!"" s="\!"1\!"" t="\!"s\!""><V>1</V></C>
<C r="\!"C1\!"" s="\!"1\!"" t="\!"s\!""><V>2</V></C>
<C r="\!"D1\!"" s="\!"1\!"" t="\!"s\!""><V>3</V></C>
<C r="\!"E1\!"" s="\!"1\!"" t="\!"s\!""><V>4</V></C>
</ROW>
<ROW r="\!"2\!"" spans="\!"1:5\!"" dydescent="\!"0.3\!"">
<C r="\!"A2\!"" t="\!"s\!""><V>5</V></C>
<C r="\!"B2\!""><V>12</V></C>
<C r="\!"C2\!"" t="\!"s\!""><V>44</V></C>
<C r="\!"D2\!""><V>59</V></C>
<C r="\!"E2\!""><V>95</V></C>
</ROW></SHEETDATA></SHEETFORMATPR></SHEETVIEWS></DIMENSION></WORKSHEET>
Re: XML 구문 분석 도움말
@uday_guntupalli 쓴 :
@Craige_Hales ,
이것은 정말 도움이 됩니다. 구조가 잘 정의된 내재된 XML 구조를 활용할 수 있습니까?
이 질문을 하는 이유는 Pat Regex 접근 방식이 빠르고 효율적이지만 소스 Excel의 미세한 변경 사항을 따라잡기 위해 스크립트를 지속적으로 변경해야 할 수도 있다는 점입니다. 문자열보다는 속성을 대상으로 지정하는 것이 더 강력할 수 있습니다.
업데이트 : 솔루션 구축을 시작하면서 Pat Regex 작업을 많이 사용할수록 솔루션 속도가 느려집니다. 확장성이 없어 보입니다. 교체해야 하는 20개 이상의 필드와 교체해야 하는 5개 열에 8760개 값의 시계열이 있습니다. 현재 8개 이상의 정규식 작업에서 JMP는 각각 평균 3.25초가 소요됩니다. 확장 가능한 다른 대안을 추천해 주실 수 있나요? 또한 Pat Regex가 끝날 때 1을 얻지 못합니다.
x = char(10);
Pat Match(
xml, // source
Pat Regex( "\[<C>\s*<V>]\" ) >> prefix + // what comes before goes in prefix
Pat Regex( "[^<]*" ) >> old + // the middle part we care about, probably some digits
Pat Regex( "\[</V>\s*</C>]\" ) >> suffix, // what comes after goes in suffix
prefix || x|| suffix // replace the matched section with this
);
Re: XML 구문 분석 도움말@Craige_Hales ,
이것은 정말 도움이 됩니다. 구조가 잘 정의된 내재된 XML 구조를 활용할 수 있습니까?
이 질문을 하는 이유는 Pat Regex 접근 방식이 빠르고 효율적이지만 소스 Excel의 미세한 변경 사항을 따라잡기 위해 스크립트를 지속적으로 변경해야 할 수도 있다는 점입니다. 문자열보다는 속성을 대상으로 지정하는 것이 더 강력할 수 있습니다.
Re: XML 구문 분석 도움말다른 어떤 것도 XML을 업데이트하지 않으면 약간의 패턴 일치로 정말 간단하게 유지할 수 있습니다.
Pat Match(
xml, // source
Pat Regex( "\[<C>\s*<V>]\" ) >> prefix + // what comes before goes in prefix
Pat Regex( "[^<]*" ) >> old + // the middle part we care about, probably some digits
Pat Regex( "\[</V>\s*</C>]\" ) >> suffix, // what comes after goes in suffix
prefix || "42" || suffix // replace the matched section with this
);
show(old);
그러면 0이 42로 바뀝니다. 이전 값(0)을 표시합니다. 다시 실행하면 42가 표시됩니다.
하드 코딩된 공백 문자 세트 대신 \s+ 및 \s*를 사용했습니다. 접미사/접두사는 문서의 실제 공백 문자를 포함하여 문서에서 캡처되므로 유일한 변경 사항은 0 -> 42여야 합니다. 중간 비트 [^<]*는 <(다음 태그의 시작)이 아닌 0개 이상의 문자를 캡처합니다.
patmatch()의 반환 코드를 테스트해야 합니다. 1이 아니면 XML은 더 이상 패턴이 기대하는 것이 아닙니다.