Aide avec l'analyse XMLTous,
Ceci est en lien 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 très gros fichier XML (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 donner un bon exemple de la meilleure façon d'utiliser Parse XML ou une fonction différente dans JSL pour avoir une idée de 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 avec 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 (gâche 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 d'exploiter le XML derrière le classeur Excel, ce que j'essaie de faire.
- Il existe peut-être un moyen d'utiliser XPath Query comme suit :
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");Il renvoie la bonne valeur dans la cellule, mais la question se pose alors de savoir comment remplacer cette valeur sans effectuer un 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 volumineux (100 000 lignes ou plus), j'ai pris un petit extrait pour fournir un exemple afin de 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 me manque d'autres options ? Existe-t-il une meilleure façon de gérer ce problème ?
Re : Aide avec l'analyse XMLps pour l'extrait de 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 avec l'analyse XML@uday_guntupalli d'après votre message précédent et cette chaîne d'e-mail, je ne suis toujours pas sûr de ce que vous essayez de faire ? Excel possède son format.J'ai fait une simple lecture à partir d'un fichier XML, j'ai écrit dans le fichier et enregistré le fichier compressé. Lorsque je l'ai ouvert dans Excel, il a indiqué qu'il était corrompu, mais lorsque 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 ? tu essaies de changer le formatage ?Quelle est la tâche spécifique, y compris sa portée (taille, tâche, mise à jour en place, ajout de lignes, suppression de 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 contient les noms de colonnes. Une fois que vous avez trouvé le Tag sheetData, les données sont organisées par ligne et cellule, pas facile de remplacer une colonne.Notez également que les cellules contenant des chaînes ont un codage supplémentaire t =\!"s\!" ce qui indique 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 existe 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 ainsi que 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 avec l'analyse XML
@uday_guntupalli a écrit:
@Craige_Hales ,
C'est vraiment utile. Pouvons-nous essayer d'exploiter la structure XML inhérente qui a une structure bien définie ?
La raison pour laquelle je pose cette question est la suivante : bien que l'approche Pat Regex soit rapide et efficace, je crains qu'elle puisse nécessiter des modifications constantes du script pour suivre les changements, même infimes, dans la source Excel. Alors que cibler les attributs plutôt que les 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. Cela n'a pas l'air évolutif. J'ai au moins 20 champs que je dois remplacer plus une série chronologique de 8 760 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 avec l'analyse XML@Craige_Hales ,
C'est vraiment utile. Pouvons-nous essayer d'exploiter la structure XML inhérente qui a une structure bien définie ?
La raison pour laquelle je pose cette question est la suivante : bien que l'approche Pat Regex soit rapide et efficace, je crains qu'elle puisse nécessiter des modifications constantes du script pour suivre les changements, même infimes, dans la source Excel. Alors que cibler les attributs plutôt que les chaînes pourrait être plus robuste ?
Re : Aide avec l'analyse XMLsi rien d'autre ne met à jour le XML, vous pouvez le garder très simple avec une petite 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). relancez-le et il affichera 42.
J'ai utilisé \s+ et \s* plutôt qu'un ensemble de caractères d'espacement codés en dur. Le suffixe/préfixe est capturé à partir du document, y compris les espaces blancs réels du document, donc le seul changement devrait ê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 ne correspond plus à ce que le modèle attend.