Hilfe beim XML-ParsingAlle,
Dies steht im Zusammenhang mit einer anderen Frage im Forum ( https://community.jmp.com/t5/Discussions/Can-JMP-Support-Excel-Formatting-through-JSL/mp/86355#M38495 ) . Ich stelle eine kleine Teilmenge einer wirklich großen XML-Datei (XML eines Arbeitsblatts in Excel) bereit. Ich würde gerne ein gutes Beispiel dafür sehen, wie man den XML-Baum durchläuft, um effizient zu einem Zielelement zu gelangen. Kann jemand ein gutes Beispiel dafür geben, wie man Parse XML oder eine andere Funktion in JSL am besten verwendet, um den Wert hier zu handhaben? und Wert bearbeiten?
<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>Ich habe Folgendes versucht und eine leere Tabelle erhalten:
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() ) ) ) ) )
);Betreff: Hilfe beim XML-Parsing@gzmorgan0 ,
Vielen Dank für eine ausführliche Antwort.
Zielsetzung : Nehmen Sie eine große Excel-Arbeitsmappe mit vielen Formatierungen und bearbeiten Sie die Werte im Blatt, ohne die Formatierung zu ändern.
Möglichkeiten die mir bisher begegnet sind:
- Verwenden Sie ein R-Paket (wie XLConnect (zu langsam) oder openxlsx (vermasselt die Formatierung und ist langsam))
- Verwenden Sie JSL
- Die Verwendung von JSL, die einzige praktikable Option, auf die ich bisher gestoßen bin, um die Formatierung beizubehalten, basiert auf Ians Vorschlag, dh auf das XML hinter der Excel-Arbeitsmappe zuzugreifen, was ich versuche.
- Es kann eine Möglichkeit geben, XPath Query wie folgt zu verwenden:
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");Es gibt den richtigen Wert in der Zelle zurück, aber dann stellt sich die Frage, wie Sie diesen Wert ersetzen, ohne eine globale Ersetzung durchzuführen.
- Verwenden Sie das VB-Skript mit Run Program, wie Sie vorgeschlagen haben.
Da das XML hinter sheet1 so groß ist (100.000 Zeilen oder mehr), habe ich einen kleinen Ausschnitt genommen, um ein Beispiel zu geben, um die Hilfe der Community zu suchen, wie ich die Hierarchie effizient aufschlüsseln kann. Ich hatte gehofft, die gesamte Lösung in JSL zu belassen und sauber und effizient zu machen, aber es sieht so aus, als müsste ich mich auf andere Programme verlassen, wenn es keine anderen Optionen zum Ändern des XML gibt. Glaubst du, es gibt noch andere Optionen, die ich vermisse? Gibt es einen besseren Weg, dieses Problem zu lösen?
Betreff: Hilfe beim XML-Parsingps für das XML-Snippet, das Sie in Ihrem Beitrag hatten, hatte nur Zelle A1 einen Wert. Es war vom Typ String und Sie müssten seinen Wert aus der Datei erhalten "xl/sharedStrings.xml"
Betreff: Hilfe beim XML-Parsing@uday_guntupalli Aus Ihrem früheren Beitrag und dieser E-Mail-Zeichenfolge bin ich mir immer noch nicht sicher, was Sie zu tun versuchen? Excel besitzt sein Format.Ich habe eine XML-bezogene Datei einfach gelesen und in die Datei geschrieben und die gezippte Datei gespeichert. Als ich sie in Excel öffnete, hieß es, sie sei beschädigt, aber als ich die Option zum Reparieren auswählte, enthielt die Excel-Arbeitsmappe meine geänderten Werte.(Vielleicht habe ich in eine Formelzelle geschrieben??).
Versuchen Sie, eine große Excel-Datei als Datenbank zum Lesen und Schreiben zu verwenden? versuchst du die Formatierung zu ändern?Was ist die spezifische Aufgabe, einschließlich des Umfangs (Größe, Aufgabe, Update vorhanden, Zeilen hinzufügen, Zeilen löschen usw.).
Unten ist ein Ausschnitt aus einer XML-Datei in einer 3-Blatt-XLSX-Datei, die aus Big Class.jmp, Iris.jmp und Semiconductor Capability.jmp erstellt wurde. Das ist das erste Blatt.Beachten Sie, dass die Dimension A1: E41 ist, da die erste Zeile Spaltennamen enthält. Sobald Sie das Tag sheetData gefunden haben, sind die Daten nach Zeile und Zelle organisiert, es ist nicht einfach, eine Spalte zu ersetzen.Beachten Sie auch, dass die Zellen mit Zeichenfolgen die zusätzliche Codierung t =\!"s\!" was bedeutet, dass es sich um eine Zeichenfolge und der Wert um eine Zahl handelt.Wenn Sie diesen Zeichenfolgenwert benötigen, müssen Sie diesen Zeichenfolgenwert in der Datei „xl/sharedStrings.xml“ nachschlagen. Die Referenznummerierung beginnt mit 0.Für diese einfache 3-Blatt-Excel-Datei gibt es 490 eindeutige Zeichenfolgen, Zeichenfolge 44 ist „F“ und 45 ist „M“ für das Geschlecht.
Wenn Sie daran interessiert sind, XML zu lesen und zu schreiben, gibt es einen Abschnitt in JSL Companion 2nd Edition und mehrere Skripte und Beispiele. Aber für das, was ich "denke", was Sie zu tun versuchen, würde ich es nicht mit XML tun.
"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>
Betreff: Hilfe beim XML-Parsing
@uday_guntupalli schrieb:
@Craige_Hales ,
Das ist wirklich hilfreich. Können wir versuchen, die inhärente XML-Struktur anzuzapfen, die eine wohldefinierte Struktur hat?
Der Grund, warum ich diese Frage stelle, ist: Obwohl der Pat Regex-Ansatz schnell und effizient ist, mache ich mir Sorgen, dass er ständige Änderungen am Skript erfordern könnte, um mit sogar winzigen Änderungen im Quell-Excel Schritt zu halten. Während das Targeting von Attributen statt Strings robuster sein könnte?
Aktualisieren : Wenn ich anfange, meine Lösung zu erstellen, wird die Lösung umso langsamer, je mehr Pat-Regex-Operationen ich verwende. Es sieht nicht skalierbar aus. Ich habe mindestens 20 Felder, die ich ersetzen muss, sowie eine Zeitreihe mit 8760 Werten in 5 Spalten, die ich ersetzen muss. Derzeit über 8 Regex-Vorgänge, JMP benötigt durchschnittlich 3,25 Sekunden pro Vorgang. Können Sie andere skalierbare Alternativen empfehlen? Außerdem bekomme ich keine 1 am Ende von 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
);
Betreff: Hilfe beim XML-Parsing@Craige_Hales ,
Das ist wirklich hilfreich. Können wir versuchen, die inhärente XML-Struktur anzuzapfen, die eine wohldefinierte Struktur hat?
Der Grund, warum ich diese Frage stelle, ist: Obwohl der Pat Regex-Ansatz schnell und effizient ist, mache ich mir Sorgen, dass er ständige Änderungen am Skript erfordern könnte, um mit sogar winzigen Änderungen im Quell-Excel Schritt zu halten. Während das Targeting von Attributen statt Strings robuster sein könnte?
Betreff: Hilfe beim XML-ParsingWenn nichts anderes das XML aktualisiert, könnten Sie es mit einem kleinen Musterabgleich wirklich einfach halten:
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);
wodurch die 0 durch 42 ersetzt wird. Es zeigt den alten Wert (0). Führen Sie es erneut aus und es wird 42 angezeigt.
Ich habe \s+ und \s* anstelle eines fest codierten Satzes von Leerzeichen verwendet. Das Suffix/Präfix wird aus dem Dokument erfasst, einschließlich der eigentlichen Leerzeichen des Dokuments, daher sollte die einzige Änderung 0 -> 42 sein. Das mittlere Bit, [^<]*, erfasst eine Reihe von null oder mehr Zeichen, die nicht < sind (der Beginn des nächsten Tags).
Testen Sie unbedingt den Rückgabecode von patmatch(). Wenn es nicht 1 ist, entspricht das XML nicht mehr dem, was das Muster erwartet.