rinominare i nomi delle colonne in un file jmp in base ai valori nelle righe in un file .csv separatoCiao,
Sono un principiante di JSL, quindi apprezzo l'aiuto.
Ho tre file.
file #1: è il file di riferimento, [come ref.csv] contenente 3 colonne come di seguito.
Categoria, larghezza, etichetta
--------------------------------
A,0,L1.abc
A,1,L2.xt
A,2,L8.dr
A,3,L20.ws
A,4,L72.oz
SI,0,L11.qq
....
B,6,L61.er
file #2: file di dati #1 in JMP, contenente Categoria, Dati e molte altre colonne.
file #3: file di dati #2 in JMP, contenente Categoria, Dati e molte altre colonne.
differenza tra i due file di dati [File #2 e file #3] è il tipo di categoria e la larghezza del valore nei dati col.
File di dati n. 1:
Categoria|dati|molti col.....
----------------------------------------
A 123,23 ....
A 321,45 ....
.....
molte file
la larghezza dei valori nella colonna "dati" [esclusi i punti] corrisponde al numero di righe nel file n. 1 per una data categoria
esempio:
la larghezza di 123,23 nella riga 1 nel file di dati n. 1 è 5.
il numero di righe nel file di riferimento per la categoria A sarebbe 5. questo non deve essere testato per dire. ecco come arrivano le tabelle [cioè quando vengono estratte dalla fonte]
In futuro, nel file di riferimento, ad esempio per la categoria A, il numero di righe aumenta a 6 o più, anche la larghezza del valore contenuto nella colonna di dati nel file di dati del file n. 1 aumenterebbe quando le informazioni vengono estratte dal database.
File di dati n. 2:
Categoria|dati|molti col.....
----------------------------------------
B 1236.23 ....
B 3213.45 ....
.....
molte file
Obiettivo 1: creare nuove colonne dipendenti dalla larghezza del valore contenuto nella colonna "dati" nel file di dati n. 1 [e altri file di dati]
Ho chiuso con l'obiettivo numero 1!
ex:
il file di dati aggiornato n. 1 sarebbe simile a questo:
Categoria|dati|c1|c2|c3|c4|c5|molte colonne.....
----------------------------------------
UN 123,23 1 2 3 2 3 ....
A 321,45 3 2 1 4 5 ....
.....
obiettivo 2: rinominare le nuove colonne nel file di dati #1 [cioè da c1 a c5] in L1... in L72... come definito nella colonna "label" nel file di riferimento. nessun cambiamento nei valori delle celle, basta aggiornare i nomi delle colonne selezionate.
output previsto dopo che l'obiettivo 2 è stato raggiunto:
Aggiorna il file di dati n. 1 in modo che assomigli a questo:
Categoria|dati|L1.abc|L2.xt|L8.dr|L20.ws|L72.oz|molti col.....
----------------------------------------
UN 123,23 1 2 3 2 3 ....
A 321,45 3 2 1 4 5 ....
.....
Ho bisogno di aiuto con l'obiettivo n.
Per l'obiettivo n. 2 ho aperto il file di riferimento ma non sono sicuro di andare avanti.
Grazie
Davide
Accesso ai datiPersonalizzazione di massaRe: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatoOK.....questo è un po' pignolo.....ma quello che c'è nel dataTablesList non è un elenco di nomi di tabelle di dati ma funzioni di data table(), che puntano a tabelle di dati.
{"Table1","Table2"} // Un elenco di nomi di tabelle di dati
{ data table( "Table1" ), data table( "Table2" ) } // un elenco di puntatori alle tabelle di datiRe: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatoSì. fatto. contiene il nome della tabella dati
-Davide
Re: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatodataTableList non contiene le tabelle di dati, contiene solo i puntatori alle tabelle. Crea l'elenco e quindi esegui
Show( dataTableList );
e vedrai cosa c'è nella lista.
Puoi anche vedere cosa c'è nell'elenco, semplicemente passando il mouse sopra la variabile, e visualizzerà il suo valore
Re: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatoGrazie Jim. Con piccole modifiche [alle mie esigenze] funziona! Grazie !!
Domanda, l'elenco [datatableList] può contenere molte informazioni?
Ciascuno dei miei tavoli ha molte righe come in migliaia e ha anche molti colonne.
-Davide
Re: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatoScusa per la mia disinformazione.Ho interpretato male la struttura della tabella dati Categorie.Di seguito è riportato uno script che crea un paio di tabelle di dati e una tabella delle categorie, quindi espande le tabelle dei dati e infine rinomina le colonne in base alle voci nella tabella dei dati delle categorie.Spero che questo ci rimetta in carreggiata.Lo script funzionerà su tutte le tabelle di dati necessarie.Tutto ciò che deve essere fatto è aggiungere all'elenco dataTableList tutte le tabelle di dati da elaborare
Names Default To Here( 1 );
// This example script opens up 2 data tables and 1 category table.
// In reality, as many as necessary data tables could be used
// Create the tables
dt1 = New Table( "Table1",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"ABC", "ABC", "ABC"} ) ),
New Column( "DATA", Character( 33 ), "Nominal", Set Values( {"123.56.8.342", "431.02.0.567", "318.00.1.816"} ), Set Display Width( 182 ) )
);
dt2 = New Table( "Table2",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"B", "B", "B"} ) ),
New Column( "Data", Character, "Nominal", Set Values( {"13.24", "98.44", "63.89"} ) )
);
dtCat = New Table( "The Categories",
Add Rows( 13 ),
New Column( "Category",
Character,
"Nominal",
Set Values( {"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "B", "B", "B", "B"} ),
Set Display Width( 67 )
),
New Column( "Width", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3] ) ),
New Column( "Label",
Character( 16 ),
"Nominal",
Set Values(
{"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7", "label0.8", "thelabel.1", "thelabel.2",
"thelabel.3", "thelabel.4"}
),
Set Display Width( 99 )
)
);
// Below this line, is the script that will add the new columns to each of the data tables
// and will take the names from the dtCat (Categories) data table and change the names to
// the columns in each of the data tables
// Create a list of the pointers to the data tables. This will allow for the using of the list
// entries to point to the data tables using a subscript
dataTableList = {};
insert into(dataTableList, dt1 );
insert into(dataTableList, dt2 );
// Loop across the data table list and expand the columns based upon the the column called Data
For( i = 1, i <= N Items( dataTableList ), i++,
ncols_to_add = length( substitute((dataTableList[i]:Data)[1],".",""));
For( k = 1, k <= ncols_to_add, k++, // the || operator joins two strings
dataTableList[i] << New Column( "c" || Char( i ),
Numeric,
Continous,
<<SET each="" value=""></SET>Re: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatoJim,
Per il passaggio 2 con le modifiche seguenti [mostrate di seguito]
++++
questo è il mio ref.csv :
categoria|larghezza|etichetta
ABC 0 etichetta0.0
Etichetta ABC 10.1
Etichetta ABC 20.2
Etichetta ABC 30.3
Etichetta ABC 40.4
Etichetta ABC 50.5
Etichetta ABC 60.6
Etichetta ABC 70.7
Etichetta ABC 80.8
Etichetta ABC 90.9
Etichetta ABC 100.10
Etichetta ABC 110.11
Etichetta ABC 120.12
Etichetta ABC 130.13
Etichetta ABC 140.14
Etichetta ABC 151.15
Etichetta ABC 160.16
Etichetta ABC 170.17
Etichetta ABC 180.18
Etichetta ABC 190.19
Etichetta ABC 200.20
Etichetta B 011.22
Etichetta C 111.21
Etichetta D 211.23
Etichetta E 011.24
Il mio codice:
dt_ref = Apri ("ref.csv");
For( i=1, i<= N Righe( dt_ref ), i++,
insert into(Category_List, word(1,:label[i],".") || "." || parola(2,:etichetta[i], "." ) );
);
mostra(Categoria_Lista);
+++
Sto ottenendo quanto segue sul registro:
Category_List = {"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7" , "label0.8", "label0.9", "label0.10", "label0.11", "label0.12", "label0.13", "label0.14", "label1.15", " label0.16", "label0.17", "label0.18", "label0.19", "label0.20", "label11.22", "label11.21", "label11.23", "label11. 24", ".", "."};
Voglio che selezioni le etichette solo quando la categoria è ABC. Come lo faccio?
Ho provato quanto segue ma non viene restituito nulla per Category_List:
prod_found ={"ABC"};
if (:product == prod_found,
For( i=1, i<= N Righe( dt_ref ), i++,
insert into(Category_List, word(1,:name[i],".") || "." || parola(2,:nome[i], "." ) );
);
);
Grazie,
Davide
Re: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatoHo guardato il codice che hai fornito.. Sembra esserci un po' di confusione.
è così che ho intercettato e mi correggo è sbagliato.
dtcat è la tabella di riferimento con nome colonna [ Categoria, larghezza, etichetta].
ci sono più tabelle di dati dt1,dt2 ecc. con la stessa struttura con nomi di colonne [Categoria|dati|molte colonne.....]
quando eseguo il codice, non fa nulla
non ci sono colonne denominate data nella tabella dtcat e hanno esaminato il debug.
Forse intendevi la tabella dt1 in quanto è una colonna di dati.
Ho provato a giocare e non sarebbe d'aiuto.
Penso che siamo allineati sulle definizioni sul tavolo, usa quello che ho descritto nel post originale, potrei aiutare secondo me.
Ancora una volta apprezzo l'aiuto qui.
Lasciami la raccomandazione per il passaggio 2
Grazie
Davide
Re: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separato- Indichi che il mio ultimo codice non funziona.....perché no?
- Ecco un modo per creare l'elenco che stai chiedendo
Category_List = {};
For( i=1, i<= N Rows( dtCat ), i++,
insert into(Category_List, word(3,:data[i],".") || "." || word(4,:data[i], "." ) );
);
Re: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatoGrazie Jim.Non funziona.
Quindi, per l'obiettivo n. 2, ho suddiviso l'intera logica in passaggi di valori.
step1: prendi i nomi delle categorie dalla tabella dati [diciamo dt1] e li memorizzi in una variabile [diciamo che contiene la categoria A]- FATTO
step2: leggi la variabile da step1 e trova tutte le righe che corrispondono a category = A] ottieni i nomi delle etichette dalla colonna "Etichetta" da ref.csv, [che hai chiamato come dtCat], e memorizzalo in un elenco o variabile. [ diciamo che si chiama elenco_categorie]
quindi usando dall'esempio indicato nella discussione. Mi aspetto che category_list contenga valori inferiori.
elenco_categoria = L1.abc, L2.xt, L8.dr, L20.ws, L72.oz
Non so come farlo. Apprezzo l'aiuto.
passaggio 3: controllare il conteggio nell'elenco == no. di nuove colonne create nel file dt1. questa è una cosa in più che sto facendo per robustezza.
count in category_list è di 5 elementi
le nuove colonne create in dt1 sono 5. [L'ho ottenuto dall'obiettivo 1 mentre tengo in mano una variabile per trovare quanti nuovi col sono necessari].
Passo 4: sostituisci i nomi cols in dt1 , cioè c[i] con list [i] usando loop dove i = 5
c1 sostituito
Sono proprio ora nel passaggio 2 e ho bisogno di aiuto.
Grazie,
Davide
Re: rinominare i nomi delle colonne in un file jmp secondo i valori nelle righe in un file .csv separatoEcco uno script non testato, che dovrebbe essere abbastanza vicino a poter raggiungere il tuo secondo obiettivo
dtCat = Data Table( "file#1 name" );
dt1 = Data Table( "file#2 name" );
dt2 = Data Table( " file#3 name" );
// add dt3, dt4 etc. for each of the categories you have
// Find the number of data tables to process....A B C......
// Create a temporary new column in data table dtCat that has just the category
dtCat << New Column( "temp", character, formula( Word( 1, :data, "." ) ) );
// Summarize the data getting one element in the ByGroup list for each Category found
Summarize( dt, Categories = ByGroup( :temp ) );
numCategories = N Items( Categories );
For( i = 1, i <= numCategories, i++,
// Subset the dtCat table into the a new data table with just the one
// category being processed
dtCat << select where( :temp == Categories[i] );
dtSub = dtCat << subset( selected rows == 1, selected columns( 0 ) );
// set the offset of where to start the renaming
offset = 3;
// Loop
// Change names in dt1 to match the Label in
For( k = 1, k <= N Rows( dtSub ), k++,
Eval(
Substitute(
Expr(
Column( __dt__, k + offset ) << set name( Word( 3, dtSub:Data[k], "." ) ),
Expr( __dt__ ),
Parse( "dt" || Char( i ) )
)
)
)
);
Close( dtSub, nosave );
);