Aiuto con l'analisi XMLTutto,
Questo è in connessione ad un'altra domanda sul forum ( https://community.jmp.com/t5/Discussions/Can-JMP-Support-Excel-Formatting-through-JSL/mp/86355#M38495 ). Sto fornendo un piccolo sottoinsieme di un file XML molto grande (XML di un foglio di lavoro in Excel). Mi piacerebbe vedere un buon esempio su come attraversare l'albero XML per raggiungere in modo efficiente un elemento mirato. Qualcuno può fornire un buon esempio su qual è il modo migliore per utilizzare Parse XML o una funzione diversa in JSL per ottenere un handle per il valore qui E modificare il valore?
<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>Ho provato quanto segue e ho ottenuto una tabella vuota:
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: Aiuto con l'analisi XML@gzmorgan0 ,
Grazie per la risposta dettagliata.
Obbiettivo : prendi una cartella di lavoro Excel di grandi dimensioni con molta formattazione e modifica i valori nel foglio senza modificare la formattazione.
Opzioni che ho incontrato finora:
- Utilizza un pacchetto R (come XLConnect (troppo lento) o openxlsx (confonde la formattazione e rallenta))
- Usa JSL
- Utilizzando JSL, l'unica opzione praticabile che ho incontrato finora per preservare la formattazione si basa sul suggerimento di Ian, ovvero attingere all'XML dietro la cartella di lavoro di Excel, che è ciò che sto cercando di fare.
- Potrebbe esserci un modo per utilizzare XPath Query in questo modo:
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");Restituisce il valore corretto nella cella, tuttavia la domanda ricade su come sostituire questo valore senza eseguire una sostituzione globale.
- Utilizza lo script VB con Esegui programma come suggerito.
Poiché l'XML dietro sheet1 è molto grande (100.000 righe o più), ho preso un piccolo frammento per fornire un esempio per chiedere aiuto alla comunità su come approfondire la gerarchia in modo efficiente. Speravo di mantenere l'intera soluzione all'interno di JSL e renderla pulita ed efficiente, ma sembra che debba fare affidamento su altri programmi se non ci sono altre opzioni per modificare l'XML. Pensi che ci siano altre opzioni che mi mancano? Esiste un modo migliore per gestire questo problema?
Re: Aiuto con l'analisi XMLps per lo snippet XML che avevi nel tuo post, solo la cella A1 aveva un valore. Era di tipo stringa e dovresti ottenere il suo valore dal file "xl/sharedStrings.xml"
Re: Aiuto con l'analisi XML@uday_guntupalli dal tuo post precedente e da questa stringa di posta elettronica, non sono ancora sicuro di cosa stai cercando di fare? Excel possiede il suo formato.Ho effettuato una semplice lettura da un file correlato XML, ho scritto nel file e salvato il file zippato e quando l'ho aperto in Excel ho detto che era danneggiato ma quando ho selezionato l'opzione per risolverlo, la cartella di lavoro di Excel conteneva i miei valori modificati.(Forse ho scritto in una cella formula??).
Stai tentando di utilizzare un file Excel di grandi dimensioni come database per leggere e scrivere? stai provando a cambiare formattazione?Qual è l'attività specifica incluso l'ambito (dimensione, attività, aggiornamento in atto, aggiunta di righe, eliminazione di righe, ecc.).
Di seguito è riportato uno snippet di un file XML in un file XLSX di 3 fogli creato da Big Class.jmp, Iris.jmp e Semiconductor Capability.jmp. Questo è il primo foglio.Elemento da notare: la dimensione è A1:E41 poiché la prima riga contiene nomi di colonne. Una volta trovato il Tag sheetData, i dati sono organizzati per riga e cella, non è facile sostituire una colonna.Tieni inoltre presente che le celle con stringhe hanno una codifica aggiuntiva t =\!"s\!" che indica che è una stringa e il valore è un numero.Se hai bisogno di quel valore di stringa devi cercare quel valore di stringa nel file "xl/sharedStrings.xml". La numerazione di riferimento inizia con 0.Per questo semplice file Excel di 3 fogli sono presenti 490 stringhe univoche, la stringa 44 è "F" e 45 è "M" per il genere.
Se sei interessato a leggere e scrivere XML, c'è una sezione in JSL Companion 2nd Edition e diversi script ed esempi. Ma per quello che "penso" tu stia cercando di fare, non lo farei con 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: Aiuto con l'analisi XML
@uday_guntupalli ha scritto:
@Craige_Hales ,
Questo è davvero utile Possiamo provare ad attingere alla struttura XML intrinseca che ha una struttura ben definita?
Il motivo per cui pongo questa domanda è che, sebbene l'approccio di Pat Regex sia veloce ed efficiente, sono preoccupato che potrebbe richiedere modifiche costanti allo script per tenere il passo anche con modifiche minime nell'Excel di origine. Mentre il targeting per attributi anziché per stringhe potrebbe essere più robusto?
Aggiornamento : Quando inizio a creare la mia soluzione, più operazioni Pat Regex utilizzo, più lenta diventa la soluzione. Non sembra scalabile. Ho almeno 20 campi che devo sostituire più una serie temporale di 8760 valori in 5 colonne che devo sostituire. Attualmente su 8 operazioni regex, JMP impiega in media 3,25 secondi ciascuna, puoi consigliare altre alternative scalabili. Inoltre, non ottengo 1 alla fine di Pat Regex.
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: Aiuto con l'analisi XML@Craige_Hales ,
Questo è davvero utile Possiamo provare ad attingere alla struttura XML intrinseca che ha una struttura ben definita?
Il motivo per cui pongo questa domanda è che, sebbene l'approccio di Pat Regex sia veloce ed efficiente, sono preoccupato che potrebbe richiedere modifiche costanti allo script per tenere il passo anche con modifiche minime nell'Excel di origine. Mentre il targeting per attributi anziché per stringhe potrebbe essere più robusto?
Re: Aiuto con l'analisi XMLse nient'altro aggiorna l'XML, potresti mantenerlo davvero semplice con una piccola corrispondenza di modelli:
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);
che sostituirà lo 0 con 42. Mostra il vecchio valore (0). eseguilo di nuovo e mostrerà 42.
Ho usato \s+ e \s* anziché un set codificato di caratteri di spazio bianco. Il suffisso/prefisso viene acquisito dal documento, inclusi gli effettivi caratteri dello spazio bianco del documento, quindi l'unica modifica dovrebbe essere 0 -> 42. Il bit centrale, [^<]*, cattura una sequenza di zero o più caratteri che non siano < (l'inizio del tag successivo).
Assicurati di testare il codice restituito da patmatch(). Se non è 1, l'XML non è più quello previsto dal modello.