Dopo ore di ricerca su Internet, non sembra esserci una risposta chiara su come realizzare ciò che voglio fare e, dopo numerosi tentativi di codifica, questa è chiaramente una di quelle aree in cui JSL differisce notevolmente da altri linguaggi di programmazione. Ho file CSV che vengono utilizzati come database in un programma VBA personalizzato per un cliente. Il motivo dell'utilizzo dei file CSV era in gran parte dovuto alla semplificazione dell'importazione del database in JMP per eseguire analisi periodiche senza dover creare una funzione di esportazione specializzata, come richiesto dalla versione precedente dello strumento personalizzato. Sto costruendo uno script per importare il file del database ed eseguire una preparazione preliminare in modo che la tabella dei dati abbia tutto a posto in modo da poter eseguire l'analisi delle prestazioni. La maggior parte di questo è piuttosto di routine ed è stato realizzato finora nel mio script JSL.
Il problema che ho ora è che ho valori zero in diversi punti che dovrebbero effettivamente mancare valori. Gli zeri derivano dall'esportazione dei dati da Excel utilizzando un oggetto dati in VBA.I dati nel file di database non sono mai su un foglio di lavoro, poiché lo strumento Excel personalizzato è completamente basato su GUI, quindi i dati effettivamente mancanti hanno un valore predefinito pari a 0 nelle proprietà che compongono l'oggetto dati nel codice; VBA non ha equivalenti di dati mancanti per i tipi di dati numerici.
Quindi, quello che voglio fare è sostituire gli zeri in colonne specifiche con valori mancanti basati su flag in altre colonne. Ad esempio, se la colonna "Dati delle letture annullate" contiene "False" in una determinata riga, tutte le colonne associate a un sondaggio sulle letture annullate per quella riga dovrebbero contenere valori mancanti, poiché non è stato condotto un sondaggio sulle letture annullate per quella particolare documentazione. Allo stesso modo, se il valore della colonna "Sondaggio annullato" è "Vero", tutte le colonne dei dati del sondaggio in quella riga dovrebbero contenere valori mancanti in quanto non è stato condotto alcun sondaggio di alcun tipo per quel record. Con gli zeri in posizione, varie statistiche risulteranno distorte perché JMP includerà record nell'analisi che dovrebbero essere ignorati.
Ho provato due metodi diversi senza alcun risultato. Il primo utilizzava una condizione e scorreva le colonne:
// set canceled data to missing if canceled survey was not performed
If(:Canceled Reads Data == "True",
{
For(i = vehiclePackageColumn, i < expiredReadsColumn, i++,
Column(i) = .
)
}
);Parte del problema qui sembra essere che i riferimenti di colonna—vehiclePackageColumn e securedReadsColumn—non sono numeri di colonna perché l'utilizzo di vehiclePackageColumn = Column("Vehicle Packages") non restituisce il numero di colonna per la colonna "Vehicle Packages". In effetti, non sono riuscito a trovare alcuna informazione su come acquisire l'indice di colonna (numero) per le colonne utilizzando JSL.
Il secondo metodo era basato su qualcosa che ho visto in un altro forum:
cancelSurveyStatus = Column(inboundDataTable, "Canceled Reads Data") << Get Values;
dataMissing[Loc(canceledSurveyStatus == "False")] = .;
Column(inboundDataTable, "Canceled Reads") << Set Values(dataMissing);
Qualsiasi aiuto con questo sarebbe molto apprezzato.
Provato. Funziona alla grande. Grazie ancora, Jim.
Questo è facile:
colnames = dt << ottiene i nomi delle colonne (stringa);
startindex = contains(colnames, "Il nome della tua colonna iniziale");
endindex = contains(colnames, "Il nome della tua colonna finale");
SÌ!
Ciò sembrava risolvere il problema principale di inserire i valori mancanti in un intervallo di colonne in base allo stato dei flag in colonne specifiche, Jim. Quindi, l'unico problema rimanente è se esiste un modo per acquisire gli indici delle colonne. La mia tabella di dati è piuttosto grande e dover contare manualmente le colonne come ho fatto nel mio test del codice suggerito è noioso e soggetto a errori; questa particolare tabella di dati ha 73 colonne.La mancanza di un mezzo per determinare il numero di colonna delle colonne denominate in JSL è una grave omissione, se non altro per operazioni come questa.
Penserei che questo potrebbe funzionare:
dt = tabella dati corrente();
For( i = il tuo numero di colonna iniziale, i <= il tuo numero di colonna finale, i++,
column( dt, i ) [dt << ottieni righe where( :Annullato Legge i dati == "True")] = .;
);