<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho appena ricevuto una richiesta su come spostare i dati da un programma esterno a JMP.Generalmente consiglierei di utilizzare file CSV per questo, ma se la compressione è un problema, forse è necessario qualcos'altro.Ecco un paio di script di prova ( dovrai assicurarti che facciano ciò di cui hai bisogno ).Poiché non ho un programma esterno, ogni script è diviso in due parti: crea un file zip da una tabella, quindi ricrea la tabella dal file zip.Ciò presuppone che tu abbia il controllo su come un processo esterno potrebbe impacchettare e presentare i dati a JMP.
Punti chiave: i file zip possono contenere dati binari (primo esempio) o stampabili (secondo esempio).Jsl MatrixToBlob e BlobToMatrix sono veloci.Non eseguire il loop o eseguire il loop solo su alcune colonne.Evitare il looping per ogni riga per molte righe.L'API del file zip di JMP aggiunge nuovi membri, eventualmente modificando il file nomeeffettivo per evitare i membri precedenti... notare il deleteFile().NON è necessario cancellare il zip (za=0); suggerisce che il file si trova all'esterno di JMP (su disco).La conversione dei numeri in stampabili e viceversa è lenta e potrebbe anche comportare perdite se i valori formattati non hanno cifre sufficienti.
Il primo script inserisce i dati grezzi in un membro del file zip in formato "little-endian", una riga alla volta.Veloce perché non si converte avanti e indietro in stampabile.
Il secondo script inserisce i dati formattati per una colonna in un membro del file zip, una colonna per membro.I dati numerici vanno in una matrice, i caratteri in una lista.
Puoi combinare idee da entrambi gli script.
Esempio 1
Questo esempio presuppone dati numerici binari.Dovrebbe esserlo davvero veloce .I dati dei personaggi non funzioneranno in questo modo...
// (questo codice non è stato testato!) crea dati numerici di esempio
dt = Nuova tabella ( "persone" , Aggiungi righe ( 1e7 ) ,
Nuova colonna ( "fredo" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Formula ( Normale casuale () ) ) ,
Nuova colonna ( "ralph" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Formula ( Normale casuale () ) ) ,
Nuova colonna ( "Giorgio" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Formula ( Normale casuale () ) , )
) ;
// crea un file zip di esempio con dati binari
datamat = ( dt : Fred << getasmatrix ) || ( dt : Ralph << getasmatrix ) || ( dt : Giorgio << getasmatrix ) ;
blobmat = matricetoblob ( datamat , "galleggiante" , 8 , "poco" ) ;
za = aprire ( "$temp/deleteme2.zip" , "cerniera lampo" ) ;
nomeeffettivo = za << scrivere ( "dati" , blobmat ) ;
// cancella la zip
za = 0 ;
// riapri il zip
za = aprire ( "$temp/deleteme2.zip" , "cerniera lampo" ) ;
spettacolo ( za << dir ) ; // controlla i membri
inizio = tickseconds () ;
blobextract = za << Leggere ( nomeeffettivo , formato ( macchia )) ;
dataextract = blobtomatrix ( blobextract , "galleggiante" , 8 , "poco" , 3 /*colonne*/ ) ;
dtextract = newtable () ;
dtextract << setmatrix ( dataextract ) ;
fermare = tickseconds () ;
spettacolo ( fermare - inizio ) ;
stop - inizio = 2.01666666666279; // decompresso+caricato 10.000.000 di righe x 3 colonne in 2 o 3 secondi
Esempio 2
Ecco un'altra variante, più lenta ma flessibile (gestisce numeri e caratteri):
// (questo codice non è stato testato!) creare dati numerici campione
dt = Nuova tabella ( "persone" , Aggiungi righe ( 1e6 ) ,
Nuova colonna ( "fredo" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Formula ( Normale casuale () ) ) ,
nuova colonna ( "fred salmerino" , carattere , formula ( car ( numero interocasuale ( 1000 , 99999 )))) ,
Nuova colonna ( "ralph" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Formula ( Normale casuale () ) ) ,
nuova colonna ( "ralph char" , carattere , formula ( car ( numero interocasuale ( 1000 , 99999 )))) ,
Nuova colonna ( "Giorgio" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Formula ( Normale casuale () ) , ) ,
nuova colonna ( "George Char" , carattere , formula ( car ( numero interocasuale ( 1000 , 99999 ))))
) ;
dt << eseguireformule () ;
// crea un file zip di esempio con dati binari
Tentativo ( cancella il file ( "$temp/deleteme.zip" )) ;
za = aprire ( "$temp/deleteme.zip" , "cerniera lampo" ) ;
collisione = dt << ottenereriferimentocolonna ;
per ( io = 1 , io <= nitems ( collisione ) , io ++,
dati = collisione [ io ] << getasmatrix ;
nome = collisione [ io ] << prendinome ;
za << scrivere ( nome , car ( dati )) ;
) ;
// cancella la zip
za = 0 ;
// riapri il zip
inizio = tickseconds () ;
za = aprire ( "$temp/deleteme.zip" , "cerniera lampo" ) ;
colnames = za << dir ; // controlla i membri
dtextract = newtable ( "estratto" ) ;
per ( io = 1 , io <= nitems ( colnames ) , io ++,
TXT = za << Leggere ( colnames [ io ]) ;
dtextract << nuovacolonna ( colnames [ io ] , valori ( analizzare ( TXT ))) ;
) ;
fermare = tickseconds () ;
spettacolo ( fermare - inizio ) ;
stop - inizio = 12.3500000000349; // decompresso+caricato 1.000.000 x 6 in 12-14 secondi