cómo recorrer un script a través de varios archivos csvsiguiendo 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 conocido como archivos step1, step2, step3, step4.
Al apilar un solo csv se crea una salida de 400.000 filas. ¿Me arriesgaré a fallar si fusiono 4 de 8 o 10 de estos csv?
Tal vez más sería volver a recorrer la siguiente carpeta en la carpeta principal, creando un nuevo archivo de pasos combinado.
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" );
Tabla de datosScriptingRe: como recorrer un script a través de múltiples archivos csvBásicamente, todo lo que tienes que hacer es
- Utilice "Archivos en el 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)
- Use 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 darte un buen punto de partida para obtener tu 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>Re: como recorrer un script a través de múltiples 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 de archivo.
Re: como recorrer un script a través de múltiples archivos csvIncreíble. Parece estar funcionando, pero luego aparecen errores después del primer archivo con un
"Nombre sin resolver: filenam} 1} en el acceso o evaluación de 'nombre de archivo', nombre de archivo / * ### * /"
¿Alguna idea?
También ajusté el script para hacer una ventana emergente de carpeta seleccionada, 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] );