Aiuto con l'analisi XMLTutto,
Questo è in connessione con 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 davvero grande (XML di un foglio di lavoro in Excel). Mi piacerebbe vedere un buon esempio su come attraversare l'albero XML per raggiungere un elemento mirato in modo efficiente. 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 una 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:
- Usa un pacchetto R (come XLConnect (troppo lento) o openxlsx (incasina la formattazione e lento))
- Usa JSL
- Utilizzando JSL, l'unica opzione praticabile che ho trovato finora per preservare la formattazione si basa sul suggerimento di Ian, ovvero di attingere all'XML dietro la cartella di lavoro di Excel, che è quello 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 cade su come sostituire questo valore senza eseguire una sostituzione globale.
- Usa lo script VB con Esegui programma come suggerito.
Poiché l'XML dietro sheet1 è così grande (100.000 righe o più), ho preso un piccolo snippet per fornire un esempio per cercare l'aiuto della comunità su come posso 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 sfuggono? C'è un modo migliore per gestire questo problema?
Re: Aiuto con l'analisi XMLps per lo snippet di XML che avevi nel tuo post, solo la cella A1 aveva un valore. Era di tipo string e dovresti ottenere il suo valore dal file "xl/sharedStrings.xml"
Re: Aiuto per 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 fatto una semplice lettura da un file correlato a xml e ho scritto sul file e salvato il file zippato e quando l'ho aperto in Excel ha 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 di formula??).
Stai cercando di utilizzare un file Excel di grandi dimensioni come database per leggere e scrivere? stai provando a cambiare la formattazione?Qual è l'attività specifica, compreso l'ambito (dimensioni, attività, data in atto, aggiunta di righe, eliminazione di righe, ecc.).
Di seguito è riportato un frammento 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.L'elemento da notare che la dimensione è A1:E41 poiché la prima riga contiene i nomi delle colonne. Una volta trovato il Tag sheetData, i dati sono organizzati per riga e cella, non è facile sostituire una colonna.Nota anche che le celle con stringhe hanno una codifica extra t =\!"s\!" indicando 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 ci sono 490 stringhe univoche, String 44 è "F" e 45 è "M" per 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 stai 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 è: mentre l'approccio di Pat Regex è veloce ed efficiente, sono preoccupato che potrebbe richiedere modifiche costanti allo script per stare al passo con modifiche anche minime nell'Excel di origine. Mentre il targeting degli attributi anziché delle stringhe potrebbe essere più robusto?
Aggiornare : 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 oltre 8 operazioni regex, JMP impiega in media 3,25 secondi per ciascuna, puoi consigliare altre alternative scalabili. Inoltre, non ricevo 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 è: mentre l'approccio di Pat Regex è veloce ed efficiente, sono preoccupato che potrebbe richiedere modifiche costanti allo script per stare al passo con modifiche anche minime nell'Excel di origine. Mentre il targeting degli attributi anziché delle stringhe potrebbe essere più robusto?
Re: Aiuto con l'analisi XMLse nient'altro aggiorna l'XML, potresti mantenerlo molto semplice con un piccolo pattern matching:
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* invece di un set codificato di spazi bianchi. Il suffisso/prefisso viene acquisito dal documento, inclusi gli effettivi spazi vuoti del documento, quindi l'unica modifica dovrebbe essere 0 -> 42. Il bit centrale, [^<]*, acquisisce una sequenza di zero o più caratteri che non sono < (l'inizio del tag successivo).
Assicurati di testare il codice di ritorno da patmatch(). Se non è 1, l'XML non è più ciò che il modello si aspetta.