Come ordinare le colonne ed eliminare le righe ripetute<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Nuovo allo scripting in JMP e desidero filtrare la tabella degli errori dello strumento. Ho una serie di dati e desidero filtrare in base alla data dell'allarme, quindi eliminare le righe ripetute di errori. Ad esempio, se si verifica un errore all'1:00 e si ripete 4 volte in 1 ora, desidero eliminare le ripetizioni e rilevare solo la prima apparizione dell'errore.
Il mio script è di seguito e desidero ricorrere allo script dopo aver eliminato le righe ripetute in base alla data dell'allarme (discendente).
dt = aperto ("SR_Loop_LAM_002_Alarm_Log.csv");
dt << ordina (per (:ENTITY), ordina (ascendente), sostituisci tabella (0));
for (i = nrighe (dt), i>0, i--,
if(:ENTITY[i-1]==:ENTITY & :ALARM_ID[i-1] == :ALARM_ID & differenza data(:ALARM_DATE[i-1], :ALARM_DATE , "ora", "frazionario") < 1,
dt << cancella righe (i))
);
dt << salva ("SR_Loop_LAM_002_Alarm_Log.csv");
chiudi (dt, nessun salvataggio)
Ri: Come ordinare le colonne ed eliminare le righe ripetuteGrazie a tutti per l'ottima risposta! Ho modificato la mia sceneggiatura e ora funziona magnificamente.
Ri: Come ordinare le colonne ed eliminare le righe ripetuteCiao Evan,
Esistono diversi modi per aggirare il problema.Esiste una sfida specifica con la rimozione dei duplicati in quanto desideri rimuovere i "duplicati" che si verificano entro un'ora dallo stesso allarme.Ciò richiede la logica della funzione di ritardo, che a sua volta richiede che i dati siano opportunamente ordinati prima dell'esecuzione.Inoltre, se elimini una riga prima dell'esecuzione della logica successiva, potresti ritrovarti con errori fuori limite nel ciclo.Una soluzione alternativa è impostare un flag per la rimozione dei duplicati; ciò può essere fatto creando una colonna booleana o utilizzando alcune funzionalità integrate.Di seguito ho modificato il tuo codice per utilizzare la selezione della riga come flag.Dopo aver eseguito la logica per determinare se l'allarme è un duplicato, tutte le righe vengono eliminate contemporaneamente.Ulteriore velocità viene aggiunta aprendo la tabella in modalità invisibile in modo da evitare l'I/O sullo schermo.
/* tabella dati resa invisibile per velocizzare l'esecuzione */
dt = Aprire ( "SR_Loop_LAM_002_Alarm_Log.csv" , invisibile ) ;
/* aggiornato per l'ordinamento multiplo */
dt << Ordinare ( Di ( : ENTITÀ , : DATA_ALLARME ) , Ordine ( Ascendente , Ascendente ) , Sostituisci tabella ( 0 ) ) ;
/* cancella prima la selezione di righe e colonne (solo una buona abitudine di codifica) */
dt << Cancella Seleziona ;
dt << Cancella selezione colonna ;
/* seleziona le righe che soddisfano le condizioni specificate
poiché va dal basso verso l'alto, il ciclo dovrebbe fermarsi alla riga 1 (non esiste la riga 0)
*/
Per ( io = N righe ( dt ) , io > 1 , io --,
Se (
: ENTITÀ [ io - 1 ] == : ENTITÀ [ io ] &
: ID_ALLARME [ io - 1 ] == : ID_ALLARME [ io ] &
Differenza di data ( : DATA_ALLARME [ io - 1 ] , : DATA_ALLARME [ io ] , "ora" , "frazionario" ) < 1 ,
dt << Seleziona Righe ( io )
)
) ;
/* cancella le righe selezionate */
dt << Elimina righe ;
/* ordinamento finale */
dt << Ordinare ( Di ( \ : DATA_ALLARME ) , Ordine ( De ascendente ) , Sostituisci tabella ( 0 ) ) ;
dt << salva ( "SR_Loop_LAM_002_Alarm_Log_cleansed.csv" ) ;
Vicino ( dt , nessun salvataggio ) ;
Ri: Come ordinare le colonne ed eliminare le righe ripetuteCIAO evanchen870
dai un'occhiata a questa discussione del passato, lo script è anche molto veloce e robusto per l'eliminazione poiché utilizza "ottieni righe dove"
Re: Interrompere un loop
buona fortuna!
Ri: Come ordinare le colonne ed eliminare le righe ripetuteSe usi la funzione Lag() non riceverai un errore.
lat(ENTITA' ) punterà alla colonna (riga) di salvataggio come ENTITY[i-1]
Ri: Come ordinare le colonne ed eliminare le righe ripetuteGrazie per la rapida risposta Ian, ma la sceneggiatura continua a non fare quello che voglio.
Attualmente ho le colonne ENTITY, ALARM_DATE, ENTITY_TYPE, ALARM_ID e ALARM_DESCRIPTION
1. Desidero innanzitutto che il mio script venga ordinato in base a ENTITY, ALARM_DATE o ENTITY_TYPE
2. quindi voglio utilizzare un ciclo if per eliminare gli allarmi ripetuti (tramite ALARM_DESCRIPTION) entro 1 ora dalla differenza oraria di ALARM_DATE
3. infine voglio ordinare per ALARM_DATE (discendente) per sostituire la tabella originale
Quindi, in base ai tuoi suggerimenti dovrò passare a (i = nrighe (dt), i>1, i--)?
Ri: Come ordinare le colonne ed eliminare le righe ripetuteSembra che tu sia quasi arrivato. Il tuo ciclo 'for' termina con il valore di i=1, ma stai indicizzando i-1=0. Gli indici JMP iniziano sempre da 1.
Ri: Come ordinare le colonne ed eliminare le righe ripetutel'errore JMP corrente è "Numero di riga non valido nell'accesso o nella valutazione di 'pedice', "ENTITY[i-1]"