cómo recorrer un script a través de múltiples archivos csvSiguiendo con una publicación anterior, tengo un script que apila y formatea un archivo csv difícil de manejar.
https://community.jmp.com/t5/Discussions/Help-doing-a-table-transform-and-converting-a-timestamp/td-p/303091
Mi siguiente pregunta de ayuda es ¿cómo puedo hacer que esto se repita en un grupo de csv en una carpeta, capturando el nombre del archivo como una de las columnas, idealmente apilándolos también? también conocidos como archivos paso1, paso2, paso3, paso4.
Apilar un solo csv crea una salida de 400.000 filas. ¿Me arriesgaré a fallar si fusiono 4, 8 o 10 de estos archivos CSV?
¿Quizás sería adicional volver a recorrer la siguiente carpeta en la carpeta principal, creando un nuevo archivo de pasos combinados?
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" );
Combinación y limpieza de datosRe: cómo pasar un script por varios archivos csvParece que el código quiere usar lista de archivos en lugar de nombre de archivo para la lista de nombres de archivos. El que está cerca del final.
Re: cómo pasar un script por varios archivos csvMiré esto pero no parece satisfacer mis necesidades. Simplemente abrirá jmp dt individuales. Los números de columna son dinámicos y se basan en el rango de tiempo de cada archivo de proceso.
Re: cómo pasar un script por varios archivos csvImpresionante. Parece estar funcionando, pero luego aparece un error después del primer archivo con un
"Nombre sin resolver: nombre de archivo}1} en el acceso o evaluación de 'nombre de archivo', nombre de archivo/*###*/"
¿Alguna idea?
También ajusté el script para que aparezca una ventana emergente de selección de carpeta, supongo que ese no es el problema.
// 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: cómo pasar un script por varios archivos csvConsulte también Importación de archivos múltiples. Carga archivos CSV, los concatena si tienen las mismas columnas y, opcionalmente, puede agregar la columna de nombre del archivo.
Re: cómo pasar un script por varios archivos csvBásicamente, todo lo que tienes que hacer es
- Utilice "Archivos en directorio() para obtener la lista de archivos que se procesarán
- Configure una tabla de datos que se utilizará para la tabla de datos final (dtFinal)
- Utilice un bucle For() para recorrer todos los archivos que se encuentran en el directorio que crea la tabla deStack
- Agregue la columna Fuente a dtStack
- Concatenar dtStack a la tabla dtFinal
- Cierre las tablas de datos dtStack y dt
A continuación se muestra su script modificado con los elementos anteriores.El código no se prueba y debe agregarlo en el directorio, etc. para leer los archivos.Debería brindarle un buen punto de partida para obtener su producto 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>