我正在尋找好的數據來演示新的Query Builder,它正在進入 JMP 3月12日。查詢生成器是一種現代SQL數據庫查詢工具,可幫助用戶發現有趣的數據並進行可重複和可共享的正確查詢。 數據需要與JMP附帶的示例數據不同。它需要是一組表,這是我們有多少客戶存儲他們的數據。並且這個集合必須在表格之間具有定義的關係,每個表格描述不同的感興趣的主題。
我應該在哪裡查找包含多個主題的數據,並且足夠豐富以顯示軟件如何加速統計發現?在我看來,我的很多同事都使用iTunes來聽音樂,他們可能會從他們的聽力中產生有趣的數據。
通過對網絡的一點研究,我發現了這一點 iTunes會生成一個XML文件使音樂和播放列表可用於其他應用程序。 這聽起來非常適合JMP。因為我是一名數據分析極客,在JMP中查看iTunes數據似乎很有趣,我可以獲得所需的數據。
我使用JSL為iTunes文件編寫了一個XML解析器。我還在JSL寫了一篇簡短的調查,收集願意分享iTunes數據的人的人口統計數據。該項目整齊地分為四個部分:
使用JMP讀取XML使用JSL調試器中的Performance Profiler提高JSL的性能使用Application Builder構建調查分析iTunes數據使用JMP讀取XML
我們經常會遇到這樣一個問題:“JMP是否打開了XML文件?”這是一個棘手的問題; XML是一個文本文件,包含在任意“標籤”樹中組織的信息。
讓我們看一個簡單的XML示例,其中包含兩個變量X和Y的數據,以及三行數據。
這是一個XML數據示例:
這是一個解析XML數據的簡單JSL示例:
example =加載文本文件(“xml data example.xml”);
解析XML
(例如,
元素
(“表”,
開始標記(新表(XML Attr(“name”)))
)
元素
(“col”,
結束標記(新列(XML Attr(“name”),
設置值(Parse(XML Text()))))
)
);
注意上面JSL中使用的三個關鍵元素。On Element語法指示在符號表示的XML“標記”內找到“table”或“col”字符串時要執行的JSL表達式。Start標記和結束標記指示應在“table”或“col”標記的開頭或標記末尾執行哪些JSL表達式。在這種情況下,每當啟動“table”標記時執行New Table表達式,並且每當“col”標記結束時(通過標記)執行New Column表達式。在結束標記處運行“新建列”和“設置值”可確保在設置值之前已全部讀取列的值。
這是結果JMP數據表:

Apple iTunes XML
現在讓我們來看看Apple如何以XML格式存儲iTunes數據。XML採用基於Apple“plist”數據結構的格式。我發現了一個 Apple網站上的文檔它給出了文件元素的基礎知識。
這是我使用iTunes生成的iTunes Library.xml文件的片段。密鑰標記用作可以是列名稱的通用觸發器,或用於指示新磁道即將到來。 其他標籤(整數,字符串等)表示數據中的觀察值並給出數據類型。
2739
跟踪ID2739
名稱財富Plango Vulnera
藝術家卡爾奧爾夫
...
這是我編寫的一個簡短的JSL程序,它似乎可以正常使用我的iTunes Library.xml文件。為了創建簡化的數據集,我只需在文本編輯器中打開.xml文件(我的是14MB)並複制前幾個有價值的數據。
iTunespath =“〜/ Music / iTunes / iTunes Library short.xml”;
//在全局“iTunespath”中將xml文件加載到內存中
cd_file_contents =加載文本文件(iTunespath);
//創建一個空數據表來保存原始數據
raw dt = New Table(“iTunes Data raw”);
raw dt <<新列(“名稱”,字符);
raw dt <<新列(“值”,字符);
//解析iTunes xml
解析XML(cd_file_contents,
OnElement(“key”,Start Tag(If(Row()> 0,raw dt << Add Rows(1))),end tag(Column(raw dt,“names”)[Row()] = XML Text( ))),
onElement(“integer”,結束標記(Column(raw dt,“values”)[Row()] = XML Text())),
onElement(“real”,結束標記(Column(raw dt,“values”)[Row()] = XML Text())),
onElement(“date”,結束標記(Column(raw dt,“values”)[Row()] = XML Text())),
onElement(“data”,結束標記(Column(raw dt,“values”)[Row()] = XML Text())),
onElement(“string”,結束標記(Column(raw dt,“values”)[Row()] = XML Text())),
onElement(“true”,結束標記(Column(raw dt,“values”)[Row()] = XML Text())),
onElement(“false”,結束標記(Column(raw dt,“values”)[Row()] = XML Text())),
結束標記(行++)
); //結束對iTunes xml的解析
以下是該程序的產生:

請注意,開頭有一些我不需要的數據,但我可以稍後清理它。
現在,最大的問題是,腳本是否會擴展到我的14MB文件?我的手錶執行時間是1分45秒。 在我的下一篇博文中,我將展示如何使用JSL Debugger的Performance Profiler來了解如何加速我的代碼。