Estrazione di parole da una riga come nome della colonna e i numeri corrispondenti come valori nella colonnaHo una colonna chiamata "Fault" - dove ho i codici di errore estratti da vari dispositivi. Di seguito è riportato uno dei codici di errore di un determinato giorno.
"inverter Inverter 20 sotto il limite: 0,96 Kilowatt / inverter (58,9% di 1,63 Kilowatt) al 30/11/2019 7:30:00 AM (sun az: 123,4 el: 3,7) Durata: 4,00 ore Inverter 23 sotto il limite: 0,95 Kilowatt / inverter (57,9% di 1,63 Kilowatt) al 30/11/2019 7:30:00 AM (sole az: 123,4 el: 3,7) Durata: 3,50 ore "
Devo estrarre i dettagli come segue nel formato ---- Nome colonna: Valore
Invertitore: 20
Limite inferiore (kW / inverter): 0,96
% del massimo: 58,9%
Data del 30/11/2019
Ora: 7:30:00 AM
Sole Az: 123,4
Elevazione: 3.7
Durata (ore): 4
Se è presente un secondo inverter che ha anche un codice di errore (vedere la seconda riga nel codice di errore sopra)
Invertitore: 23
Limite inferiore (kW / inverter): 0,95
% del massimo: 57,9%
Data del 30/11/2019
Ora: 7:30:00 AM
Sole Az: 123,4
Elevazione: 3.7
Durata (ore): 3.50
A volte potrebbero esserci 5 o 10 inverter (su 70) che potrebbero fornire codici simili in una singola riga.
Puoi farmi sapere come farlo. È solo tramite JSL? o posso usare le formule? Ad ogni modo, ho bisogno di aiuto.
Tabella datiScriptingRi: Estrazione di parole da una riga - come nome della colonna e i numeri corrispondenti come valori nella colonnaDovresti essere in grado di fare molti progressi su questo usando l'editor di formule: dai un'occhiata alla funzione WORD
Ri: Estrazione di parole da una riga - come nome della colonna e i numeri corrispondenti come valori nella colonnaDave,
Sì, potrei se ho solo 1 o 2 inverter difettosi, ma se ad esempio ho 23 codici di errore in una singola riga per una singola data, allora devo creare tante colonne individualmente e quindi scrivere formule per ciascuno dei 23 inverter. Puoi chiarire se sto comprendendo la tua soluzione.Ho anche aggiunto un'altra riga che riassume l'obiettivo dell'analisi dopo l'estrazione.
Ri: Estrazione di parole da una riga - come nome della colonna e i numeri corrispondenti come valori nella colonnaHo dovuto gestire dati come questo molte volte.L'approccio che penso debba essere adottato è leggere tutti i dati dal file di input in una tabella dati JMP, dove ogni riga completa viene letta in una singola colonna.Ti ritroverai con una tabella di dati con una colonna e il numero di righe uguale al numero di righe nella tabella dei dati di input.
Successivamente, crei una nuova tabella con 3 colonne, Etichetta, Valore e Linea.Quindi, utilizzando JSL che scansiona il contenuto di ogni riga in una colonna, si crea una nuova riga nella nuova tabella e si popola l'etichetta (es. Inverter, limite inferiore (KW / inverter) ecc.), Il valore (es. 20 , 0.96, ecc.) E la linea, che sarebbe solo il numero di riga corrente ..... Row ().Potrebbe anche essere necessaria una colonna di uscita aggiuntiva che si baserebbe sul fatto che questa sia il 1 ° inverter sulla linea o il 2 ° inverter ..... ecc.
Questo può essere fatto usando una funzione While () in combinazione con la funzione Word () che cerca ":" come delimitatore.Le parole dispari saranno le Etichette, quelle pari saranno i Valori.
Una volta creata questa nuova tabella, puoi facilmente passare a una riga per inverter, utilizzando Tabelle => Dividi.
Ri: Estrazione di parole da una riga - come nome della colonna e i numeri corrispondenti come valori nella colonnaJim
Grazie per il tuo suggerimento. Cercherò. Dato che sono nuovo nello scripting, farò degli esempi per capirlo.
Ri: Estrazione di parole da una riga - come nome della colonna e i numeri corrispondenti come valori nella colonnaHo avuto un po 'di tempo libero ... non c'è molto altro da fare con Covid-19 ancora in giro, quindi ho scritto un po' di JSL che dovrebbe darti un buon inizio con la lettura dei tuoi dati
Names Default To Here( 1 );
dt = Open(
"Path to the data file",
columns( New Column( "c000001", Character, "Nominal" ) ),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( 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( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
// Create the new output data table
dtLong = New Table( "Long Data",
New Column( "Label", character ),
New Column( "Value", character ),
New Column( "Line" ),
New Column( "Instance" )
);
// A function that returns the next word in the line and
// then removes the word from the front of the target line
getWord = Function( {},
theWord = Trim( Word( 1, target, " " ) );
target = Trim( Substr( target, Length( theWord ) + 1 ) );
theWord;
);
// Loop through all rows in the input data table
For( i = 1, i <= N Rows( dt ), i++,
instance = 0;
target = Column( dt, 1 )[i];
While( Word( 1, target, " " ) != "",
dtLong << add rows( 1 );
dtLong:line[N Rows( dtLong )] = i;
theWord = getWord();
Match( theWord,
"inverter",
instance++;
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:Label[N Rows( dtLong )] = theWord;
theWord = getWord();
theWord = getword();
dtLong:value[N Rows( dtLong )] = theWord;,
"below",
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:Label[N Rows( dtLong )] = theWord || " limit (KW/Inverter)";
theWord = getWord();
theWord = getWord();
dtLong:value[N Rows( dtLong )] = theWord;
// Get the % of Max
dtLong << Add Rows( 1 );
dtLong:line[N Rows( dtLong )] = i;
dtLong:Instance[N Rows( dtLong )] = instance;
theWord = getWord();
theWord = getWord();
dtLong:Label[N Rows( dtLong )] = "% of Max";
dtLong:value[N Rows( dtLong )] = Substr( theWord, 2 );
// Skip forward to the Date
For( k = 1, k <= 5, k++,
theWord = getWord()
);
// Get the Date
dtLong << add rows( 1 );
theWord = getWord();
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:line[N Rows( dtLong )] = i;
dtLong:Label[N Rows( dtLong )] = "Date";
dtLong:value[N Rows( dtLong )] = theWord;
// Get the Time
dtLong << add rows( 1 );
theWord = getWord();
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:line[N Rows( dtLong )] = i;
dtLong:Label[N Rows( dtLong )] = "Time";
dtLong:value[N Rows( dtLong )] = theWord || getWord();
// Get the Sun Az
dtLong << add rows( 1 );
theWord = getWord();
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:line[N Rows( dtLong )] = i;
dtLong:Label[N Rows( dtLong )] = Substr( theWord, 2 ) || " " || getWord();
dtLong:value[N Rows( dtLong )] = getWord();
// Get the Elevation
dtLong << add rows( 1 );
theWord = getWord();
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:line[N Rows( dtLong )] = i;
dtLong:Label[N Rows( dtLong )] = "Elevation";
dtLong:value[N Rows( dtLong )] = Word( -1, getWord(), ")" );,
"Duration:",
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:Label[N Rows( dtLong )] = theWord || " (hrs)";
dtLong:value[N Rows( dtLong )] = getWord();
theWord = getWord();
)
;
);
);Ri: Estrazione di parole da una riga - come nome della colonna e i numeri corrispondenti come valori nella colonnaSorprendente! Funziona Grazie per la pazienza nello scrivere questo lungo codice per soddisfare la mia richiesta. Sto cercando di implementarlo con altri codici di avviso che ho. Grazie mille, mi ha salvato eoni.