Chaîne vers table de données (optimisation du code)Un fichier .exe dans une boucle renvoie une chaîne à convertir (efficacement) en table de données.
La chaîne a les caractéristiques suivantes :
- Les lignes sont limitées par des caractères "\n", bien que cela puisse être modifié si nécessaire
- Les colonnes sont limitées par ","
- La mendicité et la fin de la ficelle ont des rangées qu'il faut éliminer
- Les lignes datetime peuvent varier. Dans l'exemple on peut en voir 7 mais ceux-ci peuvent aller jusqu'à 100k lignes.
- Ces opérations seront répétées dans la boucle dans l'ordre des centaines (chaînes différentes mais même nombre de lignes)
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...
...
...
...
...
";
Comment puis-je transformer cette chaîne en une table de données avec le format (empilé) suivant :
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
Quelles fonctions JSL peuvent gérer efficacement ces opérations de chaîne à table de données (mémoire et/ou processeur ?).
Le multi-threading ou le multitraitement ne peuvent pas être utilisés car il s'agit d'interroger une base de données.
Re : Chaîne vers table de données (optimisation du code)FN,
Curieux de savoir si vous avez essayé l'approche de Craig ? Cela a-t-il fonctionné pour votre exemple ?
-B
Re : Chaîne vers table de données (optimisation du code)... et vous pouvez toujours transmettre les paramètres CSV à cette instruction open. Si la sortie comporte des lignes supplémentaires au début que vous ne pouvez pas corriger, vous pouvez indiquer à l'instruction open la première ligne de données, la présence de noms de colonnes et les types de données à utiliser. Si les données comportent plus de quelques lignes, il peut être nettement plus rapide de dire à JMP tout ce qui se trouve dans le script source afin que JMP ne fasse pas une passe supplémentaire pour deviner le format. Le script source se trouve dans une table JMP déjà importée.
Re : Chaîne vers table de données (optimisation du code)Cool! RunProgram peut renvoyer un blob. La fonction open() peut accepter un blob à la place d'un nom de fichier. Si vous pouvez obtenir le programme externe pour créer le CSV en tant que sortie imprimée (sur stdout), cela devrait fonctionner.
exemple ici : https://community.jmp.com/t5/Discussions/Load-CSV-from-variable/mp/208453
Re : Chaîne vers table de données (optimisation du code)Oui, c'est presque une chaîne avec un format CSV, et la sortie peut être réglée dans une certaine mesure.
Le code actuel utilise RunProgram() pour obtenir la chaîne de sortie, puis Words() pour obtenir une liste, puis TextToColumns().
Pouvons-nous ouvrir () une chaîne directement? Il semble que l'ouverture ne concerne que les fichiers, ce qui devrait idéalement être évité.
Re : Chaîne vers table de données (optimisation du code)votre format ressemble beaucoup à un fichier CSV. la fonction open() comprend les données CSV, et si vous lui donnez suffisamment d'informations sur les colonnes et les types de données, cela peut être assez efficace (à la fois votre temps de développement et votre temps d'attente.)
Comment transférez-vous les données du programme .exe vers JMP ? (fichier plat ? runProgram() ? open() ? autre chose ?)
Re : Chaîne vers table de données (optimisation du code)Peut-être que mettre les deux parties dans des listes est un moyen de commencer ?
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'as-tu essayé ?