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 구문 분석에 대한 도움말ps. 게시물에 있는 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을 업데이트하는 다른 방법이 없다면 약간의 패턴 일치를 통해 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은 더 이상 패턴이 기대하는 것이 아닙니다.