Aide à l'analyse XMLTout,
Ceci est en relation avec une autre question sur le forum ( https://community.jmp.com/t5/Discussions/Can-JMP-Support-Excel-Formatting-through-JSL/mp/86355#M38495 ). Je fournis un petit sous-ensemble d'un fichier XML très volumineux (XML d'une feuille de calcul dans Excel). J'aimerais voir un bon exemple sur la façon de parcourir l'arborescence XML pour accéder efficacement à un élément ciblé. Quelqu'un peut-il fournir un bon exemple sur la meilleure façon d'utiliser le XML Parse ou une fonction différente dans JSL pour obtenir une poignée à la valeur ici et modifier la valeur ?
<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>J'ai essayé ce qui suit et j'ai obtenu une table vide:
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 : Aide à l'analyse XML@gzmorgan0 ,
Merci pour une réponse détaillée.
Objectif : Prenez un grand classeur Excel avec beaucoup de formatage et modifiez les valeurs dans la feuille sans changer le formatage.
Options que j'ai rencontrées jusqu'à présent:
- Utilisez un package R (comme XLConnect (trop lent) ou openxlsx (met en désordre le formatage et lent))
- Utiliser JSL
- En utilisant JSL, la seule option viable que j'ai rencontrée jusqu'à présent pour préserver le formatage est basée sur la suggestion d'Ian, c'est-à-dire de puiser dans le XML derrière le classeur Excel, ce que j'essaie de faire.
- Il peut y avoir un moyen d'utiliser XPath Query comme ceci :
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");Il renvoie la bonne valeur dans la cellule, mais la question est de savoir comment remplacer cette valeur sans effectuer de remplacement global.
- Utilisez le script VB avec Run Program comme vous l'avez suggéré.
Étant donné que le XML derrière sheet1 est si grand (100 000 lignes ou plus), j'ai pris un petit extrait pour fournir un exemple pour demander l'aide de la communauté sur la façon dont je peux explorer efficacement la hiérarchie. J'espérais conserver l'intégralité de la solution dans JSL et la rendre propre et efficace, mais il semble que je doive m'appuyer sur d'autres programmes s'il n'y a pas d'autres options pour modifier le XML. Pensez-vous qu'il y a d'autres options qui me manquent? Existe-t-il une meilleure façon de gérer ce problème?
Re : Aide à l'analyse XMLps pour l'extrait de code XML que vous aviez dans votre message, seule la cellule A1 avait une valeur. Il était de type chaîne et vous deviez obtenir sa valeur à partir du fichier "xl/sharedStrings.xml"
Re : Aide à l'analyse XML@uday_guntupalli à partir de votre message précédent et de cette chaîne d'e-mails, je ne suis toujours pas sûr de ce que vous essayez de faire ? Excel possède son format.J'ai fait une lecture simple à partir d'un fichier lié à xml et j'ai écrit dans le fichier et enregistré le fichier compressé et quand je l'ai ouvert dans Excel, il a dit qu'il était corrompu mais quand j'ai sélectionné l'option pour le réparer, le classeur Excel contenait mes valeurs modifiées.(Peut-être que j'ai écrit dans une cellule de formule ??).
Essayez-vous d'utiliser un gros fichier Excel comme base de données pour lire et écrire ? essayez-vous de changer le formatage ?Quelle est la tâche spécifique, y compris la portée (taille, tâche, mise à jour en place, ajouter des lignes, supprimer des lignes, etc.).
Vous trouverez ci-dessous un extrait d'un fichier XML dans un fichier XLSX de 3 feuilles créé à partir de Big Class.jmp, Iris.jmp et Semiconductor Capability.jmp. C'est la première feuille.L'élément à noter est la dimension A1: E41 puisque la première ligne est constituée de noms de colonnes. Une fois que vous avez trouvé le Tag sheetData, les données sont organisées par ligne et par cellule, pas facile de remplacer une colonne.Notez également que les cellules avec des chaînes ont un codage supplémentaire t =\!"s\!" indiquant qu'il s'agit d'une chaîne et que la valeur est un nombre.Si vous avez besoin de cette valeur de chaîne, vous devez rechercher cette valeur de chaîne dans le fichier "xl/sharedStrings.xml". La numérotation des références commence par 0.Pour ce simple fichier Excel de 3 feuilles, il y a 490 chaînes uniques, la chaîne 44 est "F" et 45 est "M" pour le sexe.
Si vous êtes intéressé par la lecture et l'écriture de XML, il existe une section dans JSL Companion 2nd Edition et plusieurs scripts et exemples. Mais pour ce que je "pense" que vous essayez de faire, je ne le ferais pas avec 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 : Aide à l'analyse XML
@uday_guntupalli a écrit:
@Craige_Hales ,
C'est vraiment utile. Pouvons-nous essayer de puiser dans la structure XML inhérente qui a une structure bien définie ?
La raison pour laquelle je pose cette question est que, même si l'approche Pat Regex est rapide et efficace, je crains qu'elle ne nécessite des modifications constantes du script pour suivre les changements même infimes dans la source Excel. Alors que cibler des attributs plutôt que des chaînes pourrait être plus robuste ?
Mise à jour : Au fur et à mesure que je commence à créer ma solution, plus j'utilise d'opérations Pat Regex, plus la solution devient lente. Il ne semble pas évolutif. J'ai au moins 20 champs que je dois remplacer plus une série chronologique de 8760 valeurs dans 5 colonnes que je dois remplacer. Actuellement sur 8 opérations regex, JMP prend en moyenne 3,25 secondes chacune, pouvez-vous recommander d'autres alternatives évolutives. De plus, je n'obtiens pas 1 à la fin de 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 : Aide à l'analyse XML@Craige_Hales ,
C'est vraiment utile. Pouvons-nous essayer de puiser dans la structure XML inhérente qui a une structure bien définie ?
La raison pour laquelle je pose cette question est que, même si l'approche Pat Regex est rapide et efficace, je crains qu'elle ne nécessite des modifications constantes du script pour suivre les changements même infimes dans la source Excel. Alors que cibler des attributs plutôt que des chaînes pourrait être plus robuste ?
Re : Aide à l'analyse XMLsi rien d'autre ne met à jour le XML, vous pouvez le garder très simple avec un peu de correspondance de modèle :
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);
qui remplacera le 0 par 42. Il affiche l'ancienne valeur (0). exécutez-le à nouveau et il affichera 42.
J'ai utilisé \s+ et \s* plutôt qu'un ensemble codé en dur d'espaces blancs. Le suffixe/préfixe est capturé à partir du document, y compris les caractères d'espace blanc réels du document, donc le seul changement doit être le 0 -> 42. Le bit du milieu, [^<]*, capture une série de zéro ou plusieurs caractères qui ne sont pas < (le début de la balise suivante).
Assurez-vous de tester le code de retour de patmatch(). Si ce n'est pas 1, le XML n'est plus ce que le modèle attend.