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 alcuni lavori 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 contenere invece i descrittori necessari per l'analisi.Inoltre, le colonne Unità (2,4 e 6) dovrebbero essere denominate dati ma contengono l'unità di misura.
| Grande:Piccolo:Bagnato | mg | Cattivo:Buono:Brutto | Hz | Babordo: 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 avrebbe la seguente struttura.
| Data | DescriptorType1 | 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 | Male | Buono | Brutta | Hz | 4 |
| 16/12/2021 | Male | Buono | Brutta | Hz | 5 |
| 17/12/2021 | Male | Buono | Brutta | Hz | 6 |
| 18/12/2021 | Male | Buono | Brutta | Hz | 7 |
| 15/12/2021 | Porta | Dritta | Velocità | ml | 8 |
| 16/12/2021 | Porta | Dritta | Velocità | ml | 9 |
I miei tentativi di inserire le intestazioni delle colonne in una tabella separata e di unirli nuovamente con i cicli for 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 annidato (che cerca solo di riportare la descrizione completa nella tabella originale) non è solo relativamente lento (è necessario per eseguire il ciclo di > 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.
Interattivamente questo è facile da fare con a Stack di più serie .
Usa Tabelle->Impila e aggiungi tutte le colonne al Impila colonne elenco. Quindi fare clic sulla casella di controllo per Stack di più serie . Impostato Numero di serie a 2 e non controllare contiguo .

Otterrai una tabella come questa:

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

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

Otterrai questo:

Se hai bisogno di script questo, 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" );
Infine, anche il testo su colonne è scriptabile.
stacked_dt << Text To Columns(
delimiter( ":" ),
columns( :Label )
);
Questo era esattamente quello che speravo.Qualcosa di semplice e che ho trascurato.Sono stato in grado di implementarlo abbastanza rapidamente.