comment parcourir un script à travers plusieurs fichiers csvfaisant suite à un article précédent, j'ai un script qui empile et formate un fichier csv peu maniable.
https://community.jmp.com/t5/Discussions/Help-doing-a-table-transform-and-converting-a-timestamp/td-p/303091
Ma prochaine question d'aide est de savoir comment puis-je faire en sorte que cela se répète ensuite sur un groupe de fichiers CSV dans un dossier, en capturant le nom de fichier comme l'une des colonnes, en les empilant idéalement également. alias fichiers step1, step2, step3, step4.
L'empilement d'un seul fichier CSV crée une sortie de 400 000 lignes. Vais-je risquer de planter si je fusionne 4, 8 ou 10 de ces fichiers CSV ?
Peut-être qu'un supplément serait de parcourir à nouveau le dossier suivant dans le dossier parent, créant ainsi un nouveau fichier d'étapes combinées ?
names default to here(1);
//Prompt to select and open an MS Excel file
dt = Open( Pick File( "Select Excel File", "C:\Users\folder\", {"Excel Files|csv;xlsx;xls", "All Files|*"}, 1, 0 ), Invisible );
// Get the column names from the data table
colNames = dt << get column names;
// Remove the 1st col from the list
remove from(colNames,1,1);
// Stack the data
dtStack = dt << Stack(
columns(
colNames
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Output Table( "Stacked_Data" )
);
//label the 1st column to Lamda
:Column 1 << Set Name("Lamda");
:Lamda << Modeling Type(nominal);
// Create a new JMP DateTime column
dtStack << New Column( "Timestamp",
Numeric,
"Continuous",
Format( "d/m/y h:m:s", 26, 3 ),
Input Format( "d/m/y h:m:s", 0 ),
Formula( Informat( Word( 1, :Label, "Z" ), "d/m/y h:m:s" ) )
);
// Remove formula to convert column to static values
dtStack:Timestamp << delete formula;
// Create the Time variable column
dtstack << New Column( "Time",
Numeric,
"Continuous",
Format( "hr:m:s", 17, 3 ),
Input Format( "hr:m:s", 0 ),
Formula( Time Of Day( :Timestamp ) )
);
//Create Absolute Time column, uses if>then error checking for Lamda group changing
dtstack << New Column( "AbsTime",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 1 ),
Formula(
If( Row() == 1 | :Lamda != Lag( :Lamda ),
0,
Lag( :AbsTime ) + (:Timestamp - Lag( :Timestamp ))
)
),
);
// Remove formula to convert column to static values
dtStack:AbsTime << delete formula;
// Get rid of no longer needed "Label" column
dtStack << delete columns( "Label" );
Mélange et nettoyage des donnéesRe : Comment parcourir un script dans plusieurs fichiers CSVOn dirait que le code souhaite utiliser la liste de fichiers plutôt que le nom de fichier pour la liste des noms de fichiers. Celui vers la fin.
Re : Comment parcourir un script dans plusieurs fichiers CSVJ'ai regardé ceci mais cela ne semble pas répondre à mes besoins. Cela ouvrira simplement les jmp dt individuels. Les numéros de colonne sont dynamiques, basés sur la plage horaire de chaque fichier de processus.
Re : Comment parcourir un script dans plusieurs fichiers CSVGénial. Cela semble fonctionner, mais des erreurs apparaissent après le premier fichier avec un
"Nom non résolu : filename}1} lors de l'accès ou de l'évaluation de 'filename', filename/*###*/"
Des pensées?
J'ai également ajusté le script pour créer une fenêtre contextuelle de sélection de dossier, je suppose que ce n'est pas le problème.
// Get a list of files from the directory
dir = Pick Directory( "Select a directory", "C:\Users\folder\");
fileList = Files In Directory( dir );
// Create a skeleton data table to end up being the combined data table
dtFinal = New Table("Final");
// Loop across all of the files found in the directory and read them in
For(i = 1, i <= N Items( fileList ), i++,
dt = open( dir || fileList[i] );Re : Comment parcourir un script dans plusieurs fichiers CSVConsultez également l’importation de fichiers multiples. Il charge les fichiers CSV, les concatène s'ils ont les mêmes colonnes et peut éventuellement ajouter la colonne du nom de fichier.
Re : Comment parcourir un script dans plusieurs fichiers CSVEn gros, tout ce que vous avez à faire, c'est de
- Utilisez "Files In Directory() pour obtenir la liste des fichiers à traiter
- Configurer une table de données à utiliser pour la table de données finale ( dtFinal )
- Utilisez une boucle For() pour parcourir tous les fichiers trouvés dans le répertoire créant la table deStack
- Ajoutez la colonne Source à dtStack
- Concaténer dtStack à la table dtFinal
- Fermez les tables de données dtStack et dt
Vous trouverez ci-dessous votre script modifié avec les éléments ci-dessus.Le code n'est pas testé et vous devez l'ajouter au répertoire, etc. pour lire les fichiers.Cela devrait vous donner un très bon point de départ pour obtenir votre produit final.
names default to here(1);
//Prompt to select and open an MS Excel file
//dt = Open( Pick File( "Select Excel File", "C:\Users\folder\", {"Excel Files|csv;xlsx;xls", "All Files|*"}, 1, 0 ), Invisible );
// Get a list of files from the directory
fileList = Files In Directory( <PATH to="" your="" directory=""> || fileList[i] );
// Get the column names from the data table
colNames = dt << get column names;
// Remove the 1st col from the list
remove from(colNames,1,1);
// Stack the data
dtStack = dt << Stack(
columns(
colNames
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Output Table( "Stacked_Data" )
);
//label the 1st column to Lamda
:Column 1 << Set Name("Lamda");
:Lamda << Modeling Type(nominal);
// Create a new JMP DateTime column
dtStack << New Column( "Timestamp",
Numeric,
"Continuous",
Format( "d/m/y h:m:s", 26, 3 ),
Input Format( "d/m/y h:m:s", 0 ),
Formula( Informat( Word( 1, :Label, "Z" ), "d/m/y h:m:s" ) )
);
// Remove formula to convert column to static values
dtStack:Timestamp << delete formula;
// Create the Time variable column
dtstack << New Column( "Time",
Numeric,
"Continuous",
Format( "hr:m:s", 17, 3 ),
Input Format( "hr:m:s", 0 ),
Formula( Time Of Day( :Timestamp ) )
);
//Create Absolute Time column, uses if>then error checking for Lamda group changing
dtstack << New Column( "AbsTime",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 1 ),
Formula(
If( Row() == 1 | :Lamda != Lag( :Lamda ),
0,
Lag( :AbsTime ) + (:Timestamp - Lag( :Timestamp ))
)
),
);
// Remove formula to convert column to static values
dtStack:AbsTime << delete formula;
// Get rid of no longer needed "Label" column
dtStack << delete columns( "Label" );
// Add filename as a column to the data table
dtStack << new column( "Source", character, set each value( filename[i] ) );
// Concatenate to final table
dtFinal << concatenate( dtStack, append to first table(1) );
// Clean up
close( dtStack, nosave );
close( dt, nosave );
// End For() Loop
);</PATH>