私は新しいQuery Builderを実演するための良いデータを探していました。 JMP 3月の12時。クエリービルダーは、ユーザーが興味深いデータを発見し、繰り返し可能で共有可能な正しいクエリーを作成するのに役立つ最新のSQLデータベースクエリーツールです。 データはJMPに同梱されているサンプルデータとは異なる必要があります。それは一組のテーブルである必要がありました、そしてそれは我々の顧客の何人が彼らのデータを保存するかです。そして、このセットはテーブル間で定義された関係を持っていなければなりませんでした、それぞれが興味のある異なるトピックを説明します。
複数のトピックを含み、ソフトウェアがどのように統計的発見を高速化できるかを示すのに十分豊富なデータをどこで探すべきですか?私の同僚の多くがiTunesを使って音楽を聴いていて、彼らが聴いて興味深いデータを生み出しているのかもしれません。
ウェブを少し調査したところ、 iTunesはXMLファイルを生成します音楽やプレイリストを他のアプリケーションで利用できるようにするため。 これはJMPによく合うように聞こえました。そして私はデータ分析オタクなので、JMPでiTunesのデータを見るのは楽しいように見え、必要なデータを手に入れることができました。
私はJSLを使用してiTunesファイル用のXMLパーサーを書きました。私はまた彼らのiTunesデータを共有しても構わないと思っていた人々から人口統計データを収集するためにJSLで簡単な調査を書きました。プロジェクトは4つの部分にうまく分割されました。
JMPによるXMLの読み方JSLデバッガのパフォーマンスプロファイラを使用したJSLのパフォーマンスの向上Application Builderを使用して調査を作成するiTunesデータの分析JMPによるXMLの読み方
「JMPはXMLファイルを開くことができますか」という質問をよく受けます。これは難しい質問です。XMLは、任意の「タグ」のツリーに編成された情報を含むテキストファイルです。
3行のデータを持つ2つの変数XとYのデータを含む単純なXMLの例を見てみましょう。
これがXMLデータの例です。
これは、XMLデータを解析するための簡単なJSLの例です。
example =テキストファイル( "xml data example.xml")を読み込みます。
XMLを解析する
(例
要素上
( "テーブル"、
開始タグ(新しいテーブル(XML Attr( "name")))
、
要素上
( "col"、
終了タグ(新しい列(XML Attr( "name")、
値を設定する(解析(XML Text()))))
)
;
上記のJSLで使用されている3つの重要な要素に注目してください。On Element構文は、"table"または "col"文字列が、シンボルで示されるXMLの "tag"内に見つかったときに実行するJSL式を示します。開始タグと終了タグは、「table」または「col」タグの先頭、またはタグの末尾にどのJSL式を実行する必要があるかを示します。この場合、New table式は、tableタグが開始されるたびに実行され、New Column式は、colタグが(タグによって)終了するたびに実行されます。終了タグで新しい列を設定して値を設定すると、値を設定する前に列の値がすべて読み取られたことを確認できます。
結果のJMPデータテーブルは次のとおりです。

アップルのiTunes XML
それでは、AppleがiTunesのデータをXMLに格納する方法を見てみましょう。XMLは、アップルの「plist」データ構造に基づくフォーマットです。私は見つけましたアップルのWebサイトにある文書それがファイル要素の基本を与えました。
これは私がiTunesを使って生成したiTunes Library.xmlファイルの断片です。キータグは、列名になる可能性のあるものに対する新しいトリガとして、または新しいトラックが来ることを示すために使用されます。 他のタグ(整数、文字列など)はデータ内の観測値を示し、データの種類を示します。
2739
トラックID2739
名フォーチュンプランゴブルネラ
アーティストカールオーフ
...
これが私の書いた短いJSLプログラムで、私のiTunes Library.xmlファイルを減らしてもうまく動作するようでした。縮小されたデータセットを作成するために、テキストエディタで.xmlファイル(私のものは14MB)を開き、最初の数トラック分のデータをコピーしました。
iTunespath = "〜/ Music / iTunes / iTunesライブラリshort.xml";
//グローバル 'iTunespath'のメモリにxmlファイルをロードします
cd_file_contents =テキストファイルを読み込みます(iTunespath)。
//生データを保持する空のデータテーブルを作成します
raw dt =新しいテーブル( "iTunes Data raw");
raw dt <<新しい列( "名前"、文字);
raw dt <<新しい列( "値"、文字);
// iTunesのxmlをパースする
XMLを解析する(cd_file_contents、
OnElement( "key"、開始タグ((Row()> 0、raw dt << Add Row(1)))、終了タグ(Column(raw dt、"names")[Row()] = XMLテキスト)))
onElement( "integer"、終了タグ(Column(raw dt、"values")[行()] = XMLテキスト()))、
onElement( "real"、終了タグ(Column(raw dt、"values")[行()] = XMLテキスト()))、
onElement( "date"、終了タグ(Column(raw dt、"values")[行()] = XMLテキスト()))、
onElement( "data"、終了タグ(Column(raw dt、"values")[行()] = XMLテキスト()))、
onElement( "string"、終了タグ(Column(raw dt、"values")[行()] = XMLテキスト()))、
onElement( "true"、終了タグ(Column(raw dt、"values")[行()] = XMLテキスト()))、
onElement( "false"、終了タグ(Column(raw dt、"values")[行()] = XMLテキスト()))、
終了タグ(行++)
; // iTunes xmlの解析を終了します
プログラムが作成したものは次のとおりです。

最初に必要のないデータがあることに注意してくださいが、後でそれを片付けることができます。
さて、大きな問題は、スクリプトは私の14MBファイルに拡大するのでしょうか。私の時計では、実行時間は1分45秒でした。 次回のブログでは、JSLデバッガのPerformance Profilerを使用してコードを高速化する方法を説明します。