CIAO,
Voglio eliminare tutte le colonne che contengono "mela" ed eliminare tutte le righe (indipendentemente dalle colonne) con valore specifico -9999. Avevo avviato il codice per eliminare la colonna ma non lo capisco.
Grazie.
dt = Open("file.csv");
//dt = Open( "$SAMPLE_DATA/Cities.jmp" );
col_list = dt << get column names( string );
For( i = N Items( col_list ), i > 0, i--,
If(Contains( col_list[i], "apple" ),
Remove From( col_list, i ),
)
);
//dt << Select Where( );
//dt << Delete Rows;
dt << save( "testOUT.txt" );È una modifica molto semplice alla sceneggiatura.Tutte le opzioni speciali per l'immissione dei dati possono essere eliminate.La funzione Open() utilizzerà semplicemente le impostazioni predefinite.
In secondo luogo, tutto ciò che deve essere fatto per eliminare le righe è cercare un valore di stringa "-9999" quando si determina che la colonna di input è di natura carattere.
i nomi predefiniti sono Qui(1);
dt=Apri(
"file (3).csv");
// Crea un elenco in cui posizionare le colonne da eliminare
dellLista = {};
For( i = 1, i<= N Cols(dt), i++,
Se( Contiene( Maiuscolo( come Colonna( i ) << ottieni nome ), "APPLE" ) > 0,
inserisci in(dellList, colonna(i)< )
);
dt << cancella colonne( dellLista);
// Passa in rassegna i dati ed elimina tutte le righe che contengono
// il valore -9999 in una qualsiasi delle colonne
For( i = 1, i <= N Cols( dt ), i++,
If( Colonna( dt, i ) << ottieni tipo dati == "Numerico",
dt << seleziona dove( Come colonna( dt, i ) == -9999 ),
dt << seleziona dove( Contiene( Come colonna( dt, i ), "-9999" ) == 1 |
Contiene( Come colonna( dt, i ), "99" ) == 1
)
);
Se (N righe (dt << ottieni righe selezionate) > 0,
dt << cancella righe
);
);
Jim,
Il codice funziona.
Quando uso "|" tubo. Creerà colonne aggiuntive.
In questo caso non voglio alcuna intestazione di colonna aggiuntiva, il totale delle colonne sarà "12".
Ma in ogni colonna posso avere diversi dati sui tubi. Mi interessa solo il primo valore e ignoro il resto.
Esempio:
"99|23|abc|x", mi interessa solo "99" e ignoro il resto.
"-9999|123", mi interessa solo "-9999" e quella riga verrà eliminata in seguito.
1 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 -9999|999|231 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 1|xyz|abc 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 -9999 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 99|23|abc|x 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
-9999|123 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1 1 1 2 30 40 1 10 99
1 1 1 1|87 1 -9999 2 30 40 1 10 99
Ecco uno script che farà quello che vuoi.Un paio di punti sulla sceneggiatura:
1. La funzione Open() ha il carattere "|" aggiunto come delimitatore oltre a ",".Questo è stato creato facilmente utilizzando "Anteprima dati" all'apertura del file .csv.Permetteva la selezione di caratteri aggiuntivi da utilizzare come delimitatori.Quindi tutto ciò che doveva essere fatto era aprire il file, quindi andare alla voce Origine nel pannello Tabelle, modificarlo e copiare il codice sorgente creato da JMP per aprire il file.
2. La soppressione delle colonne contenenti Apple doveva essere generalizzata, poiché in una colonna si scriveva Apple e in un'altra colonna si scriveva apple.
3. Non penso davvero che dovresti eliminare una riga completa, in base alla ricerca di un'occorrenza di -9999.Penso davvero che dovresti semplicemente impostare il valore -9999 su un valore mancante.Ho incluso un pezzo di codice in grado di gestire i tuoi dati in questo modo, se lo desideri.
names default to Here(1);
dt=Open(
"file.csv",
columns(
New Column( "a", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "b", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "c", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "d", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "e", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "g", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "apple", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "orange", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "candy", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "pizza", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Apple2_2", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "orange2", Numeric, "Continuous", Format( "Best", 12 ) )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, Other( "|" ), CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
// Create a list to place columns to be deleted into
delList = {};
For( i = 1, i<= N Cols(dt), i++,
If( Contains( Uppercase( as Column( i ) << get name ), "APPLE" ) > 0,
insert into(delList, column(i)<<GET name=""> 0,
dt << delete rows
);
)
);
/*// Substitute the code below for the last For Loop in the above
// script, if what you want to do is to just change the -9999
// values to missing values
For( i = 1, i <= N Cols( dt ), i++,
If( Column( dt, i ) << get datatype == "Numeric",
dt << select where( As Column( dt, i ) == -9999 );
If( N Rows(dt << get selected rows) > 0,
column(dt,i)[dt << get selected rows] = .;
);
)
);*/</GET>