Estaba buscando buenos datos para demostrar el nuevo Generador de consultas, que está llegando JMP 12 de marzo. Query Builder es una herramienta moderna de consulta de base de datos SQL que ayuda a los usuarios a descubrir datos interesantes y hacer consultas correctas que son repetibles y compartibles. Los datos debían ser diferentes de los datos de muestra que se envían con JMP. Tenía que ser un conjunto de tablas, que es la forma en que muchos de nuestros clientes almacenan sus datos. Y este conjunto debía tener una relación definida entre las tablas, cada una describiendo un tema de interés diferente.
¿Dónde debería buscar datos que contengan múltiples temas y que sean lo suficientemente ricos para mostrar cómo el software podría acelerar el descubrimiento estadístico? Se me ocurrió que muchos de mis compañeros de trabajo usan iTunes para escuchar música y que pueden estar generando datos interesantes de su escucha.
Con un poco de investigación en la web, encontré que iTunes genera un archivo XML para hacer música y listas de reproducción disponibles para otras aplicaciones. Esto sonaba como un buen ajuste para JMP. Y como soy un geek del análisis de datos, mirar los datos de iTunes en JMP me pareció divertido, y pude obtener los datos que necesitaba.
Escribí un analizador XML para el archivo de iTunes usando JSL. También escribí una breve encuesta en JSL para recopilar datos demográficos de las personas que estaban dispuestas a compartir sus datos de iTunes. El proyecto se dividió cuidadosamente en cuatro partes:
Leyendo XML con JMPMejora del rendimiento de JSL utilizando el Perfilador de rendimiento en el depurador JSLUsando el Application Builder para construir la encuestaAnalizando los datos de iTunesLeyendo XML con JMP
A menudo recibimos la pregunta, “¿Abre JMP los archivos XML?” Esta es una pregunta difícil; XML es un archivo de texto que contiene información organizada en un árbol arbitrario de "etiquetas".
Veamos un ejemplo simple de XML que contiene datos para dos variables, X e Y, con tres filas de datos.
Aquí hay un ejemplo de datos XML:
Aquí hay un ejemplo simple de JSL para analizar los datos XML:
example = cargar archivo de texto ("xml data example.xml");
Parse XML
(ejemplo
En el elemento
( "mesa",
Etiqueta de inicio (Nueva tabla (XML Attr ("nombre")))
)
En el elemento
("col",
Etiqueta de finalización (Nueva columna (Attr XML ("nombre"),
Valores establecidos (Parse (Texto XML ())))
)
);
Observe los tres elementos clave utilizados en la JSL anterior. La sintaxis del elemento On indica qué expresión JSL se ejecutará cuando la cadena "table" o "col" se encuentre dentro de la "etiqueta" XML denotada por los símbolos. La etiqueta de inicio y la etiqueta de finalización indican qué expresión JSL debe ejecutarse al comienzo de las etiquetas de "tabla" o "col" o al final de las etiquetas. En este caso, una expresión Nueva tabla se ejecuta cada vez que se inicia una etiqueta de "tabla", y una expresión Nueva columna se ejecuta cada vez que se termina una etiqueta "col" (por una etiqueta). La ejecución de la Nueva columna y los Valores establecidos en la etiqueta final garantiza que todos los valores de la columna se hayan leído antes de establecer los valores.
Aquí está la tabla de datos JMP resultante:

Apple iTunes XML
Ahora echemos un vistazo a cómo Apple almacena los datos de iTunes en XML. El XML está en un formato basado en la estructura de datos "plist" de Apple. Encontre un documento en el sitio web de Apple Eso dio los fundamentos de los elementos del archivo.
Aquí hay un fragmento del archivo iTunes Library.xml generado por mi uso de iTunes. La etiqueta de clave se utiliza como un disparador genérico para lo que podría ser un nombre de columna o para indicar que se acerca una nueva pista. Las otras etiquetas (entero, cadena, etc.) denotan observaciones en los datos y dan los tipos de datos.
2739
Identificador de pista2739
NombreFortuna Plango Vulnera
ArtistaCarl Orff
...
Aquí hay un breve programa de JSL que escribí que parecía funcionar bien con un conjunto reducido de mi archivo iTunes Library.xml. Para crear el conjunto reducido de datos, simplemente abrí el archivo .xml (el mío es de 14 MB) en un editor de texto y copié las primeras pistas de datos.
iTunespath = "~ / Music / iTunes / iTunes Library short.xml";
// Cargue el archivo xml en la memoria en el 'iTunespath' global
cd_file_contents = Cargar archivo de texto (iTunespath);
// Crear una tabla de datos vacía para mantener los datos en bruto
raw dt = New Table ("iTunes Data raw");
raw dt << Nueva columna ("nombres", carácter);
raw dt << Nueva columna ("Valores", carácter);
// Analizar el xml de iTunes
Parse XML (cd_file_contents,
OnElement ("clave", etiqueta de inicio (If (Fila ()> 0, raw dt << Add Rows (1))), etiqueta de final (Column (raw dt, "names") [Row ()] = XML Text ( ))),
onElement ("integer", etiqueta final (Columna (dt sin procesar, "valores") [Fila ()] = Texto XML ()))
onElement ("real", etiqueta final (Columna (dt sin procesar, "valores") [Fila ()] = Texto XML ()))
onElement ("fecha", etiqueta final (Columna (dt sin procesar, "valores") [Fila ()] = Texto XML ()))
onElement ("datos", etiqueta final (Columna (dt sin procesar, "valores") [Fila ()] = Texto XML ()))
onElement ("string", etiqueta final (Columna (dt sin procesar, "valores") [Fila ()] = Texto XML ()))
onElement ("true", etiqueta final (Columna (dt sin procesar, "valores") [Fila ()] = Texto XML ()))
onElement ("false", etiqueta final (Columna (dt en bruto, "valores") [Fila ()] = Texto XML ()))
Etiqueta final (fila ++)
); // final del análisis del xml de iTunes
Esto es lo que el programa produjo:

Tenga en cuenta que hay algunos datos al principio que no necesito, pero puedo limpiarlos más tarde.
Ahora, la gran pregunta es, ¿el script se escalará a mi archivo de 14MB? El tiempo de ejecución, según mi reloj, fue de 1 minuto y 45 segundos. En mi próxima publicación de blog, mostraré cómo usar el Perfilador de rendimiento del depurador JSL para averiguar cómo acelerar mi código.