XML解析を支援する全て、
これは、フォーラムの別の質問に関連しています( https://community.jmp.com/t5/Discussions/Can-JMP-Support-Excel-Formatting-through-JSL/mp/86355#M38495 )。 非常に大きなXMLファイル(ExcelのワークシートのXML)の小さなサブセットを提供しています。 XMLツリーをトラバースしてターゲット要素に効率的に到達する方法の良い例を見てみたいと思います。 誰かがParseXMLまたはJSLの別の関数を使用して、ここで値のハンドルを取得するための最良の方法についての良い例を提供できますか?と値を編集しますか?
<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>次のことを試して、空のテーブルを取得しました。
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:XML解析のヘルプ@ gzmorgan0 、
詳細な回答ありがとうございます。
目的:多くの書式設定を含む大きなExcelブックを作成し、書式設定を変更せずにシートの値を編集します。
私がこれまでに出くわしたオプション:
- Rパッケージを使用します(XLConnect(遅すぎる)またはopenxlsx(フォーマットを台無しにして遅い)など)
- JSLを使用する
- JSLを使用して、フォーマットを保持するためにこれまでに出くわした唯一の実行可能なオプションは、Ianの提案に基づいています。つまり、私がやろうとしているExcelワークブックの背後にあるXMLを利用することです。
- 次のようにXPathクエリを使用する方法があるかもしれません:
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");セルに正しい値が返されますが、グローバル置換を実行せずにこの値をどのように置換するかが問題になります。
- 提案したように、RunProgramでVBスクリプトを使用します。
sheet1の背後にあるXMLは非常に大きい(100,000行以上)ため、階層を効率的にドリルダウンする方法についてコミュニティの助けを求めるために、小さなスニペットを使用して例を示しました。 ソリューション全体をJSL内に保持し、クリーンで効率的にすることを望んでいましたが、XMLを変更する他のオプションがない場合は、他のプログラムに依存する必要があるようです。 私が見逃している他のオプションがあると思いますか? この問題を処理するためのより良い方法はありますか?
Re:XML解析のヘルプ投稿に含まれているXMLのスニペットの場合、セルA1のみに値があります。 文字列型であり、ファイルからその値を取得する必要があります"xl / sharedStrings.xml"
Re:XML解析のヘルプ@uday_guntupalliあなたの以前の投稿とこのメール文字列から、私はあなたが何をしようとしているのかまだわかりませんか? Excelはそのフォーマットを所有しています。1つのxml関連ファイルから簡単な読み取りを行い、ファイルに書き込んでzipファイルを保存しました。Excelで開いたときに破損していると表示されましたが、修正するオプションを選択すると、Excelブックに変更された値が含まれていました。(たぶん私は数式セルに書き込みましたか??)。
大きなExcelファイルをデータベースとして使用して読み取りと書き込みを行おうとしていますか?フォーマットを変更しようとしていますか?スコープ(サイズ、タスク、適切なudate、行の追加、行の削除など)を含む特定のタスクは何ですか。
以下は、Big Class.jmp、Iris.jmp、およびSemiconductorCapability.jmpから作成された3シートのXLSXファイル内の1つのXMLファイルからの抜粋です。 これが最初のシートです。最初の行が列名であるため、ディメンションがA1:E41であることに注意してください。 タグsheetDataを見つけると、データは行とセルごとに整理され、列を置き換えるのは簡単ではありません。また、文字列を含むセルには追加のコーディングt = \! "s \!"があることに注意してください。文字列であり、値が数値であることを示します。その文字列値が必要な場合は、ファイル「xl/sharedStrings.xml」でその文字列値を検索する必要があります。 参照番号は0から始まります。この単純な3枚のExcelファイルには、490個の一意の文字列があり、文字列44は「F」、45は性別の「M」です。
XMLの読み取りと書き込みに興味がある場合は、JSL Companion2ndEditionのセクションといくつかのスクリプトと例があります。 しかし、あなたがやろうとしていることについて、私は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:XML解析のヘルプ
@uday_guntupalli書きました:
@Craige_Hales 、
これは本当に役に立ちます。 明確に定義された構造を持つ固有のXML構造を利用してみることができますか?
私がこの質問をする理由は、Pat Regexのアプローチは高速で効率的ですが、ソースExcelのわずかな変更に対応するために、スクリプトを絶えず変更する必要があるのではないかと心配しています。 文字列ではなく属性をターゲットにすると、より堅牢になる可能性がありますか?
アップデート:ソリューションの構築を開始すると、使用するPat Regex操作が増えるほど、ソリューションの速度が低下します。 スケーラブルに見えません。 置き換える必要のあるフィールドが少なくとも20個あり、それに加えて、置き換える必要のある5列の8760値の時系列があります。 現在8を超える正規表現操作で、JMPはそれぞれ平均3.25秒かかりますが、他のスケーラブルな代替手段をお勧めできますか。 さらに、PatRegexの最後に1が表示されません。
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:XML解析のヘルプ@Craige_Hales 、
これは本当に役に立ちます。 明確に定義された構造を持つ固有のXML構造を利用してみることができますか?
私がこの質問をする理由は、Pat Regexのアプローチは高速で効率的ですが、ソースExcelのわずかな変更に対応するために、スクリプトを絶えず変更する必要があるのではないかと心配しています。 文字列ではなく属性をターゲットにすると、より堅牢になる可能性がありますか?
Re:XML解析のヘルプXMLを更新するものが他にない場合は、パターンマッチングを少し行うだけで、XMLを非常にシンプルに保つことができます。
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);
これにより、0が42に置き換えられます。 古い値(0)を示しています。もう一度実行すると、42が表示されます。
ハードコードされた空白文字のセットではなく、\s+と\s*を使用しました。 接尾辞/プレフィックスは、ドキュメントの実際の空白文字を含めてドキュメントから取得されるため、変更は0->42のみである必要があります。 中央のビット[^<]*は、<(次のタグの先頭)ではない0個以上の文字の実行をキャプチャします。
patmatch()からの戻りコードを必ずテストしてください。 1でない場合、XMLはパターンが期待しているものではなくなります。