Trova e sostituisci a livello di tabella in uno script<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho diverse tabelle di dati di grandi dimensioni (+100.000 record) create da un collega in Europa.
Quando sono state create le tabelle è stato utilizzato il formato di numerazione UE, ovvero "," è il punto decimale.
Devo eseguire una sostituzione a livello di tabella per sostituire "," con un "." affinché la tabella funzioni con gli script esistenti.
Posso ottenere i nomi delle colonne con un'istruzione get columnnames(), ma non riesco a capire come utilizzare le istruzioni replace(...) o replace into(...) per eseguire una sostituzione sulla massa.
Davide
Ri: Trova e sostituisci a livello di tabella in uno scriptCiao David,
Ho avuto lo stesso problema, ma inverso: una sostituzione globale del punto con la virgola Delimitatori in una serie di file di registro del processo.
Ho scoperto che il modo più semplice per uscire da questo problema era salvare ogni file jmp come file di testo e quindi importarlo utilizzando l'opzione "migliore ipotesi" di JMP.
Ha sostituito i delimitatori originali con quello previsto dal sistema (nel mio caso “.” è stato sostituito con “,” ) e ha riclassificato le colonne da categoriche a continue. Ne ho fatto uno manualmente e ho utilizzato il sorgente per uno script che elaborava il resto.
Ri: Trova e sostituisci a livello di tabella in uno scriptDiscussione interessante.Ho giocato con un po' di codice e ho ottenuto 49 secondi per una ridenominazione globale di 65394 colonne.PC Lenovo T420, Windows 7 a 64 bit, JMP a 64 bit, 4 GB di RAM.
dt = aprire ( "$dati_campione\Sonda.jmp" ) ;
// Estende il numero di colonne a 65000
// ATTENZIONE ci vogliono circa 10 minuti!
per ( io = 1 , io <= 65000 , io ++,
dt << nuova colonna ( "XYZ" || car ( io ) , Numerico , Continuo ) ;
) ;
start_dt = Oggi () ;
col_name_list = dt << ottenere i nomi delle colonne ( corda ) ;
nc = ncols ( dt ) ;
Per ( io = 1 , io <= nc , io ++,
one_col_name = col_name_list [ io ] ;
// Rinomina la colonna solo se contiene la stringa in questione
Se ( contiene ( one_col_name , "X" ) ,
colonna ( io ) << imposta nome ( sostituire ( one_col_name , "X" , "D" )) ;
) ;
) ;
fine_dt = Oggi () ;
stampa ( car ( fine_dt - start_dt ) || "secondi per" || car ( nc ) || "colonne" ) ;
Ri: Trova e sostituisci a livello di tabella in uno scriptHo provato a richiamare la finestra di dialogo di ricerca utilizzando l'approccio seguente ma non funziona in modo affidabile. Sembra che la finestra di dialogo venga disconnessa quando le impostazioni vengono modificate dallo script. Ma forse qualcuno può trovare un modo per migliorare il codice.
Se questo file insolitamente ampio proviene dall'esterno di JMP, potrebbe essere più efficiente modificare i nomi delle colonne prima dell'importazione, ad esempio tramite uno script Perl o VBA che eventualmente può essere attivato da JSL (può dipendere dalla piattaforma).
dt = tabella dati corrente () ;
vecchio = "C" ;
Nuovo = "Q" ;
dt << Porta la finestra in primo piano ;
// Richiama la finestra di dialogo di ricerca e modifica le impostazioni
Menu principale ( "Trovare" ) ;
w = finestra ( "Finestra di ricerca" ) ;
w [ Casella di modifica testo ( 1 )] << impostare il testo ( vecchio ) ;
w [ Casella di modifica testo ( 2 )] << impostare il testo ( nuovo ) ;
Se ( w [ Casella di controllo Casella ( 2 )] << Ottenere , w [ Casella di controllo Casella ( 2 )] << impostato ( 1 )) ;
Se ( w [ Casella di controllo Casella ( 6 )] << Ottenere , w [ Casella di controllo Casella ( 6 )] << impostato ( 1 )) ;
Se (( w [ Casella di controllo Casella ( 7 )] << Ottenere ) == 0 , w [ Casella di controllo Casella ( 7 )] << impostato ( 1 )) ;
w [ pulsante ( 3 )] << Clic ;
//Menu principale("Sostituisci tutto");
Ri: Trova e sostituisci a livello di tabella in uno scriptForse ho confuso ciò che David stava chiedendo in base al suo commento di "Ottieni nomi di colonna".Avevo l'impressione che volesse cambiare i nomi delle colonne (non i dati effettivi delle righe).In ogni caso, è quello che sto cercando di fare.Voglio cambiare il nome di più colonne (ovvero rimuovere "labdata" dal nome di ogni colonna).Questo è ciò che farà il mio script sopra.In JSL sono necessari circa 19 secondi su 85.000 colonne.La "finestra di ricerca" richiede solo una frazione di secondo.
Tutte le idee su come fare Quello senza un ciclo For (o uno super efficiente)?
Grazie,
Jake
Ri: Trova e sostituisci a livello di tabella in uno scriptCon JMP 11 su un MacBook Pro ottengo "2 secondi per 5800 righe" o 1,753558 secondi se utilizzo HP time( ) invece di Today( ).
Contrariamente a quanto affermato sopra, la ricerca e sostituzione integrata qui è molto più lenta. Il codice seguente richiede 16,27 secondi per essere completato (il codice presuppone che la finestra di dialogo di ricerca sia "preparata" da una precedente ricerca manuale).
dt = aprire ( "$Dati_campione\Sonda.jmp" ) ;
start_dt = Tempo HP () ;
Menu principale ( "Sostituisci tutto" ) ;
fine_dt = Tempo HP () ;
stampa ( car (( fine_dt - start_dt ) / 1e6 ) || "secondi per" || car ( n ) || "righe" ) ;
Ri: Trova e sostituisci a livello di tabella in uno scriptEcco un esempio con una tabella di grandi dimensioni dal set di dati di esempio.Ha solo 5800 righe e richiede 8 secondi.JMP 11 a 64 bit su un Lenovo T420.Sarebbe interessante confrontare approcci diversi.
dt = aprire ( "$Dati_campione\Sonda.jmp" ) ;
col_names = dt << ottenere i nomi delle colonne ( numerico , Corda ) ;
per ( io = 1 , io <= nitems ( col_names ) , io ++,
colonna ( dt , col_names [ io ]) << tipo di dati ( Carattere ) ;
) ;
start_dt = Oggi () ;
n = nrows ( dt ) ;
col_names = dt << ottenere i nomi delle colonne ( Corda ) ;
per ( io = 1 , io <= nitems ( col_names ) , io ++,
uno_col = colonna ( dt , col_names [ io ]) ;
per ( K = 1 , K <= n , K ++,
uno_col [ K ] = sostituire ( uno_col [ K ] , "." , "," ) ; // Sostituisci il decimale con la virgola
) ;
) ;
fine_dt = Oggi () ;
stampa ( car ( fine_dt - start_dt ) || "secondi per" || car ( n ) || "righe" ) ;
Ri: Trova e sostituisci a livello di tabella in uno scriptCiao David,
**Dopo aver scritto tutto questo, mi sono reso conto che la domanda originale era stata pubblicata MOLTO tempo fa.Tuttavia, la mia domanda "più efficiente" rimane ancora se qualcuno può aiutarmi. **
Sto cercando di capire questa stessa cosa.Una soluzione è utilizzare un ciclo For e lavorare su ciascuna colonna individualmente, ma ciò può richiedere una notevole quantità di tempo a seconda del set di dati.Il codice di esempio è elencato di seguito come riferimento.
dt = tabella dati corrente();
Per( i=1,i<=ncol(dt),i++,
colname = Colonna(i) << ottieni nome;
nuovonomecol = munger(colname,1,"replacestring",""); // Potresti fare una cosa simile con il comando "Sostituisci".
Colonna (i) << Imposta nome (newcolname);
);
Qualcuno conosce un modo più efficiente di un ciclo For per occuparsi di questo?Ad esempio, quando si utilizza la finestra di dialogo standard "Trova e sostituisci", questa viene eseguita molto rapidamente.Tuttavia, su circa 65.000 colonne, l'approccio For Loop richiede molto tempo.
Grazie,
Jake