Stavo cercando dati validi per dimostrare il nuovo generatore di query, che sta arrivando JMP 12 marzo. Query Builder è un moderno strumento di query del database SQL che aiuta gli utenti a scoprire dati interessanti e ad effettuare query corrette ripetibili e condivisibili. I dati devono essere diversi dai dati di esempio forniti con JMP. Doveva essere un insieme di tabelle, ovvero quanti dei nostri clienti memorizzano i loro dati. E questo set doveva avere una relazione definita tra i tavoli, ognuno dei quali descriveva un diverso argomento di interesse.
Dove devo cercare i dati che contenevano più argomenti ed era abbastanza ricco da mostrare come il software potrebbe accelerare la scoperta statistica? Mi è venuto in mente che molti dei miei colleghi usano iTunes per ascoltare musica e che potrebbero generare dati interessanti dal loro ascolto.
Con una piccola ricerca sul web, l'ho trovato iTunes genera un file XML per rendere disponibili musica e playlist ad altre applicazioni. Sembrava una buona idea per JMP. E poiché sono un fanatico dell'analisi dei dati, guardare i dati di iTunes in JMP mi è sembrato divertente e ho potuto ottenere i dati di cui avevo bisogno.
Ho scritto un parser XML per il file iTunes usando JSL. Ho anche scritto un breve sondaggio in JSL per raccogliere dati demografici da persone che erano disposte a condividere i loro dati di iTunes. Il progetto si è suddiviso ordinatamente in quattro parti:
Lettura di XML con JMPMigliorare le prestazioni di JSL utilizzando Performance Profiler nel debugger JSLUtilizzando l'Application Builder per costruire il sondaggioAnalizzando i dati di iTunesLettura di XML con JMP
Spesso riceviamo la domanda: "JMP apre file XML?" Questa è una domanda complicata; XML è un file di testo che contiene informazioni organizzate in un albero arbitrario di "tag".
Diamo un'occhiata a un semplice esempio XML contenente i dati per due variabili, X e Y, con tre righe di dati.
Ecco un esempio di dati XML:
Ecco un semplice esempio JSL per analizzare i dati XML:
esempio = carica file di testo ("xml data example.xml");
Analizza XML
( esempio,
Sull'elemento
( "tavolo",
Start Tag (Nuova tabella (XML Attr ("nome"))))
),
Sull'elemento
("col",
End Tag (New Column (XML Attr ("nome"),
Imposta valori (Parse (XML Text ())))))
)
);
Nota i tre elementi chiave usati nella JSL sopra. La sintassi On Element indica quale espressione JSL deve essere eseguita quando la stringa "table" o "col" viene trovata all'interno del "tag" XML denotato dai simboli. Il tag di inizio e il tag di fine indicano quale espressione JSL deve essere eseguita all'inizio dei tag "table" o "col" o alla fine dei tag. In questo caso, un'espressione Nuova tabella viene eseguita ogni volta che viene avviato un tag "table" e un'espressione New Column viene eseguita ogni volta che un tag "col" viene terminato (da un tag). L'esecuzione della nuova colonna e impostare i valori sul tag di fine garantisce che i valori per la colonna siano stati letti prima di impostare i valori.
Ecco la tabella di dati JMP risultante:

Apple iTunes XML
Ora diamo un'occhiata a come Apple memorizza i dati di iTunes in XML. L'XML è in un formato basato sulla struttura dei dati "plist" di Apple. Ho trovato un documento sul sito Web di Apple che ha fornito le basi degli elementi del file.
Ecco uno snippet del file iTunes Library.xml generato dal mio utilizzo di iTunes. Il tag chiave viene utilizzato come trigger generico per quello che potrebbe essere il nome di una colonna o per indicare che una nuova traccia sta arrivando. Gli altri tag (intero, stringa, ecc.) Denotano osservazioni nei dati e forniscono i tipi di dati.
2739
Track ID2739
NomeFortuna Plango Vulnera
ArtistaCarl Orff
...
Ecco un breve programma JSL che ho scritto che sembrava funzionare bene con un set ridotto del mio file Library.xml di iTunes. Per creare il set ridotto di dati, ho semplicemente aperto il file .xml (il mio è 14MB) in un editor di testo e copiato le prime tracce di dati.
iTunespath = "~ / Music / iTunes / iTunes Library short.xml";
// Carica il file xml in memoria nel Global 'iTunespath'
cd_file_contents = Carica file di testo (iTunespath);
// Crea una tabella di dati vuota per contenere i dati non elaborati
raw dt = New Table ("Dati di iTunes raw");
dt grezzo << Nuova colonna ("nomi", carattere);
dt grezzo << Nuova colonna ("Valori", carattere);
// Analizza l'xml di iTunes
Parse XML (cd_file_contents,
OnElement ("chiave", Start tag (If (Row ()> 0, raw dt << Add Rows (1))), end tag (Column (dt grezzo, "nomi") [Row ()] = XML Text ( ))),
onElement ("intero", end tag (Column (dt grezzo, "valori") [Row ()] = XML Text ())),
onElement ("reale", end tag (Column (dt grezzo, "valori") [Row ()] = XML Text ())),
onElement ("date", end tag (Column (dt grezzo, "valori") [Row ()] = XML Text ())),
onElement ("data", end tag (Column (dt grezzo, "valori") [Row ()] = XML Text ())),
onElement ("string", end tag (Column (dt grezzo, "valori") [Row ()] = XML Text ())),
onElement ("true", end tag (Column (dt grezzo, "valori") [Row ()] = XML Text ())),
onElement ("false", end tag (Column (dt grezzo, "valori") [Row ()] = XML Text ())),
End Tag (row ++)
); // fine analisi di iTunes xml
Ecco cosa ha prodotto il programma:

Si noti che all'inizio ci sono alcuni dati che non ho bisogno, ma posso ripulirlo più tardi.
Ora, la grande domanda è: lo script scalerà il mio file di 14 MB? Il tempo di esecuzione, secondo il mio orologio, era di 1 minuto e 45 secondi. Nel mio prossimo post, mostrerò come utilizzare il Performance Profiler di JSL Debugger per scoprire come velocizzare il mio codice.