Ho diversi file csv che devono essere ripuliti.I file in questione hanno due strutture di blocchi di dati di base.Il primo blocco è composto da 1 colonna con 7 righe di informazioni.Il secondo segmento contiene 6 colonne con più di 5 righe di dati.
Per il primo blocco, la trasformazione ideale è spezzare la colonna in due pezzi.Un pezzo fornirà l'intestazione o il nome della colonna. E il secondo pezzo fornirà informazioni sui dati su quello specifico esperimento.
Il secondo blocco necessita di un intervento minimo.
Finora sono riuscito ad avvicinarmi allo stato desiderato, ad eccezione di un paio di punti fastidiosi.Innanzitutto, spezzare il file csv in due parti, due tabelle, non è un problema.La prima tabella dati –dt1- è il file csv originale da cui vengono estratti i dati e alcune righe cancellate per creare una seconda tabella dati –dt2.La seconda tabella dati contiene la colonna 1 con 7 righe; che necessitano di ulteriori cure.
Per fare ciò, inizio con una nuova tabella di dati -dt3.Sono riuscito a creare le intestazioni di colonna con un For Loop e prendere il primo elemento di un elenco.Questa informazione proviene da dt2.La parte successiva è quella che mi sta dando un problema.Devo passare o inviare il secondo elemento dell'elenco alla prima riga di dt3.
Prima domanda:
Perché la riga seguente è in grado di modificare la prima cella della colonna 1 nella tabella dati originale (dt1) ma la parte di codice successiva non funziona sulla nuova tabella dati?
dt1[1,1]=300; //questo funziona
dt3[1,1]=300; //questo non funziona.Produce un errore.
pedice non valido (deve essere un numero o un elenco di numeri) nell'accesso o nella valutazione di 'Assign' , dt3[1, 1] = /*####*/300 /*####*/
Seconda domanda
Uso : come identificatore di carattere per separare le prime sette righe in informazioni di intestazione e dati di riga.Lo svantaggio di questo approccio è che la riga Data/Ora ha 3 di questi caratteri e i dati vengono persi dopo il secondo trovato :.Come posso evitare che ciò accada?
Qualche idea o suggerimento? Il file Excel allegato è un esempio di tabella dati.
Grazie mille per qualsiasi assistenza
Esempio di file csv originale
Ricetta alimentare: 1 salsa densa | | | |
Ricetta frullatore: 3 velocità | | | |
Temperatura Ricetta: 100 Vapore | | | |
Attrezzatura da cucina: inossidabile | | | |
ID lotto: Mini-torta-100 | | | |
ID campione: Mini-Cake-100.1 | | |
Data/Ora: 30/06/2017 16:12:44 | | |
| | | | | |
| | | | | |
Punto | Densità | Zucchero | Rapporto | X | Y |
1 | 5020.607 | 98.6872 | 0,9976 | 145 | 0 |
2 | 4976.009 | 98.1275 | 0,9955 | 108,75 | 0 |
3 | 4977.177 | 98.3677 | 0,9958 | 72.5 | 0 |
4 | 4982.821 | 98.2569 | 0,9957 | 36.25 | 0 |
5 | 4989.282 | 98.2105 | 0,9977 | 0 | 0 |
Esempio di tabella dati 2 (dt2). 1 Colonna con 7 righe. Il : separa il nome della colonna dalle informazioni sperimentali.
Ricetta alimentare: 1 salsa densa |
Ricetta frullatore: 3 velocità |
Temperatura Ricetta: 100 Vapore |
Attrezzatura da cucina: inossidabile |
ID lotto: Mini-torta-100 |
ID campione: Mini-Cake-100.1 |
Data/Ora: 30/06/2017 16:12:44 |
Trasformazione desiderata di dt2.
Ricetta alimentare | Ricetta del frullatore | Ricetta temperatura | Hardware da cucina | ID lotto | ID campione | Appuntamento |
1-Salsa densa | 3 velocità | 100 vapore | Inossidabile | Mini-torta-100 | Mini-torta-100.1 | ######## |
Codice JSL
<BR />
Names Default To Here( 1 );
Close All(data tables);
Clear Log();
Clear Symbols();
Close All(Journals, No Save);
//***********************************************************************************************************************************************************
/*Open collected data from a share drive
and assign working data table(s) -->dt1
*/
dt1 = Open(
"C:\Users\...................filename.csv",
columns(
Column( "c000001", Character, "Nominal" ),
Column( "c000002", Character, "Nominal" ),
Column( "c000003", Character, "Nominal" ),
Column( "c000004", Character, "Nominal" ),
Column( "c000005", Character, "Nominal" ),
Column( "c000006", Character, "Nominal" )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, 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" )
)
);
//The raw data table repeats information every 48 rows
//This table separates each item into individual tables
//The generated table does not have formated column headings
//For(i=1, i <=x, i++, //this For loop is ignored for now until dt2 --> dt problem is solved
selrows =dt1 <<SELECT rows=""></SELECT>
Il tuo primo problema è che non ci sono righe nella tua tabella di dati dt3. Se aggiungi
dt3 << add rows(N Rows( dt2 ));
subito dopo aver creato dt3, sarai in grado di popolare quella tabella.
Il secondo problema è che quello che vuoi non è la seconda parola della stringa, ma piuttosto tutto ciò che segue la prima ":". Pertanto, l'utilizzo della funzione Substr() funzionerà meglio:
dt3[iii, 1] = Trim Whitespace( substr(Column( dt2, 1 )[iii], contains(column( dt2, 1 ), ":") ) )