<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je viens de recevoir une demande concernant un moyen de déplacer des données d'un programme externe vers JMP.En général, je recommanderais d'utiliser des fichiers CSV pour cela, mais si la compression pose un problème, quelque chose d'autre est peut-être nécessaire.Voici quelques scripts de preuve de concept ( tu devras t'assurer qu'ils font ce dont tu as besoin ).Comme je n'ai pas de programme externe, chaque script est en deux parties : créer un fichier zip à partir d'une table, puis recréer la table à partir du fichier zip.Cela suppose que vous contrôlez la manière dont un processus externe peut conditionner et présenter les données à JMP.
Points clés : les fichiers zip peuvent contenir des données binaires (premier exemple) ou imprimables (deuxième exemple).Jsl MatrixToBlob et BlobToMatrix sont rapides.Ne faites pas de boucle, ou faites simplement une boucle sur quelques colonnes.Évitez de boucler chaque ligne sur un grand nombre de lignes.L'API de fichier zip de JMP ajoute de nouveaux membres, modifiant éventuellement le nom réel pour éviter les membres antérieurs… remarquez le deleteFile().Effacer le zip (za=0) n’est PAS requis ; cela laisse entendre que le fichier se trouve en dehors de JMP (sur le disque).La conversion des nombres en fichiers imprimables et inversement est lente et peut également entraîner une perte si les valeurs formatées ne contiennent pas suffisamment de chiffres.
Le premier script place les données brutes dans un membre de fichier zip au format « petit-boutiste », une ligne à la fois.Rapide car il ne se convertit pas en imprimable.
Le deuxième script place les données formatées d'une colonne dans un membre de fichier zip, une colonne par membre.Les données numériques vont dans une matrice, les caractères dans une liste.
Vous pouvez combiner les idées des deux scripts.
Exemple 1
Cet exemple suppose des données numériques binaires.Ça devrait être vraiment rapide .Les données de personnages ne fonctionneront pas comme ça…
// (ce code n'a pas été testé !) crée des exemples de données numériques
dt = Nouveau tableau ( "personnes" , Ajouter des lignes ( 1e7 ) ,
Nouvelle colonne ( "fred" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Formule ( Aléatoire Normal () ) ) ,
Nouvelle colonne ( "ralph" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Formule ( Aléatoire Normal () ) ) ,
Nouvelle colonne ( "George" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Formule ( Aléatoire Normal () ) , )
) ;
// crée un exemple de fichier zip avec des données binaires
datamat = ( dt : fred << getasmatrix ) || ( dt : Ralph << getasmatrix ) || ( dt : George << getasmatrix ) ;
tapis de blob = matricetoblob ( datamat , "flotter" , 8 , "petit" ) ;
za = ouvrir ( "$temp/deleteme2.zip" , "fermeture éclair" ) ;
nom réel = za << écrire ( "données" , tapis de blob ) ;
// effacer le zip
za = 0 ;
// réouverture du zip
za = ouvrir ( "$temp/deleteme2.zip" , "fermeture éclair" ) ;
montrer ( za << dir ) ; // vérifie les membres
commencer = ticksecondes () ;
extrait de goutte = za << lire ( nom réel , format ( goutte )) ;
extraction de données = blobtomatrice ( extrait de goutte , "flotter" , 8 , "petit" , 3 /*Colonnes*/ ) ;
dextrait = nouvelle table () ;
dextrait << ensemblematrice ( extraction de données ) ;
arrêt = ticksecondes () ;
montrer ( arrêt - commencer ) ;
arrêt - démarrage = 2,01666666666279 ; // décompressé+chargé 10 000 000 de lignes x 3 colonnes en 2 à 3 secondes
Exemple 2
Voici une autre variante, plus lente mais flexible (gère les chiffres et les caractères) :
// (ce code n'a pas été testé !) créer des exemples de données numériques
dt = Nouveau tableau ( "personnes" , Ajouter des lignes ( 1e6 ) ,
Nouvelle colonne ( "fred" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Formule ( Aléatoire Normal () ) ) ,
nouvelle colonne ( "fred char" , personnage , formule ( carboniser ( entier aléatoire ( 1000 , 99999 )))) ,
Nouvelle colonne ( "ralph" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Formule ( Aléatoire Normal () ) ) ,
nouvelle colonne ( "ralph char" , personnage , formule ( carboniser ( entier aléatoire ( 1000 , 99999 )))) ,
Nouvelle colonne ( "George" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Formule ( Aléatoire Normal () ) , ) ,
nouvelle colonne ( "george char" , personnage , formule ( carboniser ( entier aléatoire ( 1000 , 99999 ))))
) ;
dt << exécuter des formules () ;
// crée un exemple de fichier zip avec des données binaires
essayer ( supprimer le fichier ( "$temp/deleteme.zip" )) ;
za = ouvrir ( "$temp/deleteme.zip" , "fermeture éclair" ) ;
Colliste = dt << obtenir la référence de la colonne ;
pour ( je = 1 , je <= articles ( Colliste ) , je ++,
données = Colliste [ je ] << getasmatrix ;
nom = Colliste [ je ] << obtenir un nom ;
za << écrire ( nom , carboniser ( données )) ;
) ;
// effacer le zip
za = 0 ;
// réouverture du zip
commencer = ticksecondes () ;
za = ouvrir ( "$temp/deleteme.zip" , "fermeture éclair" ) ;
noms de colonnes = za << dir ; // vérifie les membres
dextrait = nouvelle table ( "extrait" ) ;
pour ( je = 1 , je <= articles ( noms de colonnes ) , je ++,
SMS = za << lire ( noms de colonnes [ je ]) ;
dextrait << nouvelle colonne ( noms de colonnes [ je ] , valeurs ( analyser ( SMS ))) ;
) ;
arrêt = ticksecondes () ;
montrer ( arrêt - commencer ) ;
arrêt - démarrage = 12,3500000000349 ; // décompressé+chargé 1 000 000 x 6 en 12 à 14 secondes