Trasponi i dati di intestazione e concatena i fileHo una serie di file csv di dati grezzi con metadati nell'intestazione che voglio concatenare e copiare i dati dell'intestazione in colonne. Sono stato in grado di modificare lo script "Combine txt tables.jsl" che ho trovato su questo sito per inserire i dati dell'intestazione, trasporli e unirli alla tabella dei dati grezzi. I dati di intestazione sono contenuti all'interno di ogni file di dati grezzi nelle righe da 2 a 29 e li traspongo per trasformare la prima colonna in nomi di colonne e la seconda colonna in metadati, duplicati in ogni riga di dati grezzi. Per qualche motivo sta solo estraendo il primo file e non continua il ciclo di importazione. La mia sceneggiatura è la seguente:
names default to here (1);
Clear Symbols();
//set up variables with starting values
filelist={}; //empty list
//launch dialog to get the file location
prefilepath = munger(Pick Directory( "Browse to the Directory of the .txt / .csv files " ),1,"/","");
filepath = Convert File Path( prefilepath, Windows );
prefilelist = Files In Directory( filepath );
n2=nitems(prefilelist);
//filter out any non-txt or csv files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
// changed from item 2 to item -1
If( Item( -1, prefilelist[i2], "." ) == "txt" | Item( -1, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);
//filter out any non-Excel files for the file list.
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( -1, prefilelist[i2], "." ) == "xls" | Item( -1, prefilelist[i2], "." ) == "xlsx",
Insert Into( filelist,file),
show(file)
)
);
//Create raw data table:
nf=nitems(filelist); //number of items in the working list
For( iii = 1 , iii <= nf, iii++, //this starts the first loop
filenow = ( filelist[iii] );
fileopen=(filepath||filenow);
dt=open(fileopen,private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, 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( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( 29 ),
Year Rule( "20xx" )
)
);
//Transpose header data into new columns and create "Transposed Header Table"
dt<<( "Header table" ) << Transpose(
columns( :TTV0.000000 ),
Label( :Name( "Test Name:" ) ),
Output Table( "Transposed Header table" )
);
//New Column( "Source", Character, Nominal );
//:Source << set each value( filenow );
dt=open(fileopen,private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, 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( 1 ),
Column Names Start( 32 ),
Data Starts( 33 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
New Column( "Source", Character, Nominal );
:Source << set each value( filenow );
//Merge header table with raw data into "Combined Data Table"
dtjoined=dt<< Join(
With( Data Table( "Transposed Header table" ) ),
Cartesian Join
);
//add the current table to the bottom of the combined data table
dtjoined << Concatenate( Data Table( dt ), Append to first table );
dtjoined << Set Name("Combined Data Table");
Close(Data Table("Transposed Header table"),NoSave);
Close(Data Table("Header table"),NoSave);
dt << Run Formulas();
);//end of the first for loopPenso che il ciclo si fermi a causa della denominazione della tabella. Se commento "Close(Data Table("Header table"),NoSave);" script importa correttamente il primo file, quindi si interrompe. Se estraggo il commento, ottengo una tabella di dati con il primo set di dati grezzi e dati di intestazione importati come previsto più i dati grezzi del secondo file di dati mancanti dei dati di intestazione. Non va mai oltre quel secondo file. Di seguito è riportato un esempio che mostra come viene formattato il file di dati non elaborati, con metada nelle righe da 1 a 3 e dati non elaborati a partire dalla riga 5:
| Ciclo di prova | 1 | | |
| Laboratorio | Laboratorio_A | | |
| Numero di serie | 123 ABC | | |
| Tempo | metrica A | Metrico B | Metrico C |
| 1 | 1 | 70 | 60 |
| 2 | .1 | 71 | 61.1 |
| 3 | .2 | 73 | 62.5 |
| 4 | .3 | 78 | 63.8 |
| 5 | .4 | 80 | 65.7 |
| 6 | .5 | 85 | 69.2 |
| 7 | .6 | 89 | 72.3 |
Re: Trasporre i dati di intestazione e concatenare i file@mlipsitz
La tua risposta di ringraziamento non è una voce appropriata per essere etichettata come "Soluzione".I lettori devono avere un puntatore alle risposte che contengono effettivamente la soluzione.Si prega di selezionare le risposte che mostrano le soluzioni.
Re: Trasporre i dati di intestazione e concatenare i fileGrazie mille ian_jmp E gzmorgan0 . Sono d'accordo che stavo lottando con parte della sintassi e cercando di combinare il codice da varie fonti. sono stato in grado di ottenere gzmorgan0 codice di funzionare con alcuni piccoli aggiustamenti. Vedi il copione allegato. Sì, tutti i miei file sono formattati in modo identico da un sistema di acquisizione dati automatizzato. Grazie ancora per il tuo aiuto e per la lezione di sintassi!
Re: Trasporre i dati di intestazione e concatenare i fileNessun problema: uno dei miei tanti difetti è che trovo difficile lavorare con il codice di qualcun altro
. . .
Re: Trasporre i dati di intestazione e concatenare i fileScusa @ian_jmp , devi aver pubblicato il tuo script mentre stavo modificando il post.
Re: Trasporre i dati di intestazione e concatenare i file@mlipsitz , ci sono diversi problemi con questo script. Penso che tu debba fare più lavoro imparando la sintassi JSL di base.Sì, impariamo tutti una lingua prendendo il codice già scritto e modificandolo, ma hai bisogno di alcune nozioni di base.Ad esempio, questa parte del tuo script sembra che tu stia cercando di rinominare la tabella dt. Non c'è posto nel tuo codice dove c'è una colonna ::TTV0.000000 è definita, e questa trasposizione sarebbe non fai quello che penso tu voglia fare.
//Transpose header data into new columns and create "Transposed Header Table"
dt<<( "Header table" ) << Transpose(
columns( :TTV0.000000 ),
Label( :Name( "Test Name:" ) ),
Output Table( "Transposed Header table" )
);
Inoltre, quando viene eseguito il codice seguente, dt è la tabella dei valori dei dati grezzi prima del join cartesiano e dtjoined è la tabella dei valori con le etichette. Stai sovrascrivendo tabelle (collisioni di nomi).
//add the current table to the bottom of the combined data table
dtjoined << Concatenate( Data Table( dt ), Append to first table );
Ecco un paio di suggerimenti:
- Non rendere private le tabelle fino a quando lo script non è stato scritto e funziona correttamente.
- dt è solo una scorciatoia per un riferimento a una tabella. Va bene riutilizzare (riutilizzare) un nome di variabile, ma non lo consiglio per una tabella fino a quando la tabella precedente non viene chiusa. Usa nomi di variabili che rendono il codice più leggibile, per esempio dthdr per la tabella di intestazione e dtx per la tavola trasposta.
- Chiudi il tavolo non appena non servono più.
- Lo vuoi davvero unire i file O concatenare File? Se ogni file ha le stesse metriche, penso che tu voglia concatenare.
- Metti alla prova il tuo script con un paio di file. In altre parole, impara come ottenere un colpo di base, prima di oscillare per le recinzioni.
Le tue dichiarazioni di lettura non avevano senso per la tua tabella di esempio.Sei sicuro che tutti i file abbiano lo stesso formato?O hai bisogno di cercare uno schema per determinare dove iniziano i dati grezzi?Questo script funzionerà con i formati di file corretti. Il numero di righe di dati non elaborati può cambiare.Nota, ho codificato l'elenco dei file da testare. Il codice per ottenere i file sembra a posto.
Names default to Here(1);
filelist = {"example1_20190214.txt", "example2_20190214.txt"};
filepath = "c:\temp\";
df = nitems(filelist);
for(iii=1, iii<=df, iii++,
filenow = filelist[iii];
fileopen=(filepath||filenow);
dthdr=open(fileopen,//private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, 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(0 ),
Data Starts( 1 ),
Lines To Read( 3 ),
Year Rule( "20xx" )
)
);
nc = ncol(dthdr);
dthdr << Combine Columns( Delimiter(" "), Columns(2::nc), Column Name("Info") );
dthdr << delete columns(3::nc);
//Transpose header data into new columns and create "Transposed Header Table"
dthdr<< set name( "Header table" );
dtx = dthdr << Transpose(
columns( :Info ),
Label( Column(1) ),
Output Table( "Transposed Header table" )
);
dtx << delete column (:Label);
//Close Header table
Close(dthdr,Nosave);
//New Column( "Source", Character, Nominal );
//:Source << set each value( filenow );
dt=open(fileopen,//private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, 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( 1 ),
Column Names Start( 4 ),
Data Starts( 5 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
New Column( "Source", Character, Nominal );
:Source << set each value( filenow );
//Merge Transposed Header table, dtx, with raw data table, dt
dtjoined=dt<< Join(
With( dtx ),
Cartesian Join
);
//close Transposed Header table
Close(dtx, NoSave);
//close raw data table, dt
Close(dt, NoSave);
//For the first file, keep it, it will be used to append other file
//For the other files, append then close
If (iii==1 , dtfinal = dtjoined,
//else
current data table(dtfinal);
dtfinal << Concatenate( dtjoined , Append to first table(1));
wait(0);
close(dtjoined, NoSave)
);
//no need for Run Formulas() there are no formulas in the table
); //end the for iii loop
//Give the final table a name
dtfinal << set name( "Combined Data Table");
Ho testato questo script usando il file che hai visualizzato e una modifica di quel file. Ecco il risultato usando lo script sopra.

Re: Trasporre i dati di intestazione e concatenare i fileUtilizzando il formato in fondo al tuo messaggio, ecco un codice che elaborerà i file .CSV sul desktop (di un Mac)
NamesDefaultToHere(1);
// Get a list of .csv files on the desktop
fileList = FilesInDirectory("$DESKTOP");
for(f=NItems(fileList), f>=1, f--, If(!EndsWith(Uppercase(fileList[f]), ".CSV"), RemoveFrom(fileList, f)));
fileList;
// Process each .csv file
For(f=1, f<=NItems(fileList), f++,
// Get metadata (generated by JMP)
dtm = Open(
"$DESKTOP/"||fileList[f],
columns(
New Column( "Name", Character, "Nominal" ),
New Column( "Value", 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 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( 3 ),
Year Rule( "20xx" )
),
Invisible
);
// Get data (generated by JMP)
dtd = Open(
"$DESKTOP/"||fileList[f],
columns(
New Column( "Time", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Meric A", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Metric B", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Metric C", Numeric, "Continuous", Format( "Best", 12 ) )
),
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( 1 ),
Column Names Start( 4 ),
Data Starts( 5 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
),
Invisible
);
// Add the values from dtm to dtd
for (c=1, c<=NRow(dtm), c++,
vals = {}; for(r=1, r<=NRow(dtd), r++, InsertInto(vals, Column(dtm, 2)[c]));
dtd << newColumn(Column(dtm, 1)[c], Character, Values(vals));
);
Close(dtm, NoSave);
// Append tables
if(f==1,
dtFinal = Eval(dtd << GetScript),
dtFinal << Concatenate(dtd, AppendToFirstTable);
);
Close(dtd, NoSave);
);
// Tidy up dtFinal
dtFinal << ShowWindow(1);
dtFinal << setName("Final Data");
dtFinal << deleteProperty("Source");