Cadena a tabla de datos (optimización de código)Un archivo .exe dentro de un bucle devuelve una cadena que es necesario convertir (eficientemente) en una tabla de datos.
La cadena tiene las siguientes características:
- Las filas están limitadas por los caracteres "\n", aunque esto se puede cambiar si es necesario
- Las columnas están limitadas por ","
- El principio y el final de la cadena tiene filas que uno necesita eliminar
- Las filas de fecha y hora pueden variar. En el ejemplo se pueden ver 7 pero estos pueden llegar hasta 100k filas.
- Estas operaciones se repetirán dentro del bucle en el orden de cientos (cadenas diferentes pero el mismo número de filas)
str_query =
"*> mycolumnname
1,mycolumnname,50.,mycolumdescription,mycolumnunits
* End exe...
*> mycolumnname, 31-Jan-2020 14:30:00, 31-Jan-2020 15:30:00, blabla, 7
31-Jan-20 14:30:00,mycolumnname,10.60466
31-Jan-20 14:40:00,mycolumnname,10.60466
31-Jan-20 14:50:00,mycolumnname,10.60466
31-Jan-20 15:00:00,mycolumnname,10.60466
31-Jan-20 15:10:00,mycolumnname,10.60466
31-Jan-20 15:20:00,mycolumnname,10.60466
31-Jan-20 15:30:00,mycolumnname,10.60466
* End exe...
...
...
...
...
";
¿Cómo puedo transformar esta cadena en una tabla de datos con el siguiente formato (apilado):
31-Jan-20 14:30:00,mycolumnname,10.60466,mycolumdescription,mycolumnunits
31-Jan-20 14:40:00,mycolumnname,10.60466,mycolumdescription,mycolumnunits
31-Jan-20 14:50:00,mycolumnname,10.60466,mycolumdescription,mycolumnunits
31-Jan-20 15:00:00,mycolumnname,10.60466,mycolumdescription,mycolumnunits
31-Jan-20 15:10:00,mycolumnname,10.60466,mycolumdescription,mycolumnunits
31-Jan-20 15:20:00,mycolumnname,10.60466,mycolumdescription,mycolumnunits
31-Jan-20 15:30:00,mycolumnname,10.60466,mycolumdescription,mycolumnunits
¿Qué funciones JSL pueden administrar estas operaciones de cadena a tabla de datos de manera eficiente (¿memoria y/o CPU?).
No se pueden usar subprocesos múltiples o procesamiento múltiple, esto es consultar una base de datos.
Re: Cadena a tabla de datos (optimización de código)fn,
¿Tienes curiosidad por saber si probaste el enfoque de Craig? ¿Funcionó para tu ejemplo?
-B
Re: Cadena a tabla de datos (optimización de código)... y aún puede pasar los parámetros CSV a esa declaración abierta. Si la salida tiene líneas adicionales al principio que no puede arreglar, puede decirle a la declaración abierta sobre la primera línea de datos, la presencia de nombres de columna y qué tipos de datos usar. Si los datos tienen más de unas pocas líneas, puede ser notablemente más rápido decirle a JMP todo lo que está en el script de origen para que JMP no haga un paso adicional para adivinar el formato. El script de origen se puede encontrar en una tabla JMP ya importada.
Re: Cadena a tabla de datos (optimización de código)¡Enfriar! RunProgram puede devolver un blob. La función open() puede aceptar un blob en lugar de un nombre de archivo. Si puede obtener el programa externo para crear el CSV como su salida impresa (en la salida estándar), debería funcionar.
ejemplo aquí: https://community.jmp.com/t5/Discussions/Load-CSV-from-variable/mp/208453
Re: Cadena a tabla de datos (optimización de código)Sí, es casi una cadena con formato CSV, y la salida se puede ajustar hasta cierto punto.
El código actual usa RunProgram() para obtener la cadena de salida, luego Words() para obtener una lista y luego TextToColumns().
¿Podemos abrir () una cadena directamente? Parece que abierto es solo para archivos, lo que idealmente debería evitarse.
Re: Cadena a tabla de datos (optimización de código)su formato se parece mucho a un archivo CSV. la función open() entiende los datos CSV, y si le proporciona suficiente información sobre las columnas y los tipos de datos, puede ser bastante eficiente (tanto su tiempo de desarrollo como su tiempo de espera).
¿Cómo obtiene los datos del programa .exe a JMP? (¿archivo plano? ¿ejecutar programa()? ¿abrir()? ¿algo más?)
Re: Cadena a tabla de datos (optimización de código)¿Tal vez poner las dos partes en listas es una forma de comenzar?
clear globals();
query =
"*> mycolumnname 1,mycolumnname,50.,mycolumdescription,mycolumnunits
* End exe...
*> mycolumnname, 31-Jan-2020 14:30:00, 31-Jan-2020 15:30:00, blabla, 7
31-Jan-20 14:30:00,mycolumnname,10.60466
31-Jan-20 14:40:00,mycolumnname,10.60466
31-Jan-20 14:50:00,mycolumnname,10.60466
31-Jan-20 15:00:00,mycolumnname,10.60466
31-Jan-20 15:10:00,mycolumnname,10.60466
31-Jan-20 15:20:00,mycolumnname,10.60466
31-Jan-20 15:30:00,mycolumnname,10.60466
* End exe...
...
...
...
...
";
query=Substitute( query, "*> mycolumnname ", "colnames=list(" );
query=Substitute( query, "* End exe...", ");" );
query=Substitute( query, "*> mycolumnname, ", "coldata=list(" );
query=Substitute( query, "* End exe...", ");" );
for(i=1, i<=5, i++, query=Substitute( query, "...", "" ));
show(query);<BR /><BR />
¿Qué has probado?