Saluti,
Ho bisogno di aiuto per lo scripting di un processo in più fasi poiché non sono in grado di astrarre una soluzione praticabile per ottenere un lavoro di preparazione dei dati.
Ho dati di serie temporali che arrivano come diversi fogli di calcolo, contenenti diverse schede, e ogni scheda ha dati con nomi di colonne che contengono metadati che contestualizzano i dati.
Nell'esempio seguente, le colonne con "Descrittore" (colonne 1, 3 e 5) dovrebbero in realtà essere denominate "Data", ma invece contenere Descrittori necessari per l'analisi.Inoltre, le colonne Unità (2,4 e 6) dovrebbero in realtà essere denominate dati ma contenere l'unità di misura.
| Grande: Piccolo: Bagnato | mg | Cattivo:Buono:Brutto | Hz | Porto: Tribordo: Velocità | ml |
| 15/12/2021 | 0 | 15/12/2021 | 4 | 15/12/2021 | 8 |
| 16/12/2021 | 1 | 16/12/2021 | 5 | 16/12/2021 | 9 |
| 17/12/2021 | 2 | 17/12/2021 | 6 | 17/12/2021 | 10 |
| 18/12/2021 | 3 | 18/12/2021 | 7 | 18/12/2021 | 11 |
Idealmente, la tabella dati finita dovrebbe avere la seguente struttura.
| Data | DescrittoreTipo1 | DescrittoreTipo2 | DescrittoreTipo3 | Unità | Dati |
| 15/12/2021 | Grande | Piccolo | Bagnato | mg | 0 |
| 16/12/2021 | Grande | Piccolo | Bagnato | mg | 1 |
| 17/12/2021 | Grande | Piccolo | Bagnato | mg | 2 |
| 18/12/2021 | Grande | Piccolo | Bagnato | mg | 3 |
| 15/12/2021 | Cattivo | Bene | Brutto | Hz | 4 |
| 16/12/2021 | Cattivo | Bene | Brutto | Hz | 5 |
| 17/12/2021 | Cattivo | Bene | Brutto | Hz | 6 |
| 18/12/2021 | Cattivo | Bene | Brutto | Hz | 7 |
| 15/12/2021 | Porta | Dritta | Velocità | ml | 8 |
| 16/12/2021 | Porta | Dritta | Velocità | ml | 9 |
I miei tentativi di estrarre le intestazioni di colonna in una tabella separata e ricongiungerli con i cicli nidificati non hanno avuto successo.Ecco il codice che estrae e prepara i dati del nome della colonna per i dati di esempio inclusi.
Names Default to Here(1);
//Get MainDT column Names
colNames = Data Table("Data") << Get Column Names;
//Create Empty Table
dtCols = New Table("DTCols");
//Put in Columns into the table
dtCols << New Column( "Columns", Character, Values(colNames));
//Label every other row for splitting
dtCols << New Column( "Data", formula( sequence(1,2,1)));
//Remove formula from Data column
dtCols:Data << Delete Formula;
<BR />//New column from which to split from
dtCols << New Column( "Type", formula(
If(
contains(:Columns, "Desc"), "Meta",
"Unit_Raw"
);
);
);
//Deleting formula for handling
dtCols:Type << Delete formula;
//Splitting the row based on the labelling
splitdtCols = dtCols << Split(
Split By( :Type ),
Split( :Columns ),
Sort by Column Property,
Output Table( "SplitDTCols" )
);
//Text to Columns by ":"
splitdtCols << text to columns(delimiter(":"), columns(:Meta));Il ciclo for nidificato (che cerca solo di riportare la descrizione completa nella tabella originale) non è solo relativamente lento (questo è necessario per scorrere > 1 milione di voci) ma scrive solo i dati mancanti nelle colonne.
//Meta column back into Data
For(i = 1, i <= N Items(colNames), i++,
For(j = 1, j <= N Rows(splitdtCols), j++,
//show(splitdtCols:Meta[j]);
If( eval(char(colNames[i])) == eval(char(splitdtCols:Meta[j])),
Data Table("Data") << New Column("Descriptor", set Values(eval(char(splitdtCols:Meta[j]))))
)
)
);Sono disposto ad abbandonare l'approccio di estrarre i dati del nome della colonna in una tabella separata.Sembra davvero che ci sia un approccio più semplice che mi manca.
Questo era esattamente quello che speravo.Qualcosa di semplice e che ho trascurato.Sono stato in grado di implementarlo abbastanza rapidamente.
Interattivamente questo è facile da fare con a Pila di più serie .
Usa Tabelle->Stack e aggiungi tutte le colonne al file Impila colonne elenco. Quindi fare clic sulla casella di controllo per Pila di più serie . Impostato Numero di serie a 2 e non controllare contiguo .

Otterrai una tabella come questa:

Rinominare il Dati colonna a Data e il Etichetta 2 colonna a Unità .

Quindi, puoi usare Cols->Utilities-> SMS a Col... per dividere la colonna Etichetta in tre colonne utilizzando i due punti (":") come delimitatore.

Otterrai questo:

Se hai bisogno di scrivere questo script, perché questo è qualcosa che devi automatizzare o lo fai molto, puoi ottenere lo script per lo script Stack from Source:
stacked_dt = Data Table( "445470" ) << Stack(
columns(
:"Big:Small:Wet"n, :mg, :"Bad:Good:Ugly"n, :Hz, :"Port:Starboard:Speed"n,
:mL
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Number of Series( 2 )
);
Dovrai usare il < messaggio per modificare i nomi delle colonne.
stacked_dt:"Data" << Set Name( "Date" );
stacked_dt:"Label 2" << Set Name( "Units" );
Finalmente anche Text to Columns è scriptabile.
stacked_dt << Text To Columns(
delimiter( ":" ),
columns( :Label )
);