Abra 25 tablas, Resumen para cada una y Concatenar todas las tablas de resumen.Hola,
Soy un nuevo usuario de JMP y trato de hacer algo de manipulación automática de datos con JSL. Como se describe en el título, necesito
Para (i = 1, i <= Nitems ("directorio"), i ++,
1) Abrir una de las 25 mesas;
2) Generar una tabla de resumen de la tabla abierta;
);
3) Después de recorrer todas las 25 tablas, genere una tabla concatenada de 25 tablas de resumen.
He hecho la 1ª y 2ª parte y las he enlazado. Pero no estoy seguro de cómo concatenar automáticamente las 25 tablas de resumen resultantes. Ahora los concatené manualmente después de que se generen todas las tablas.
La falta de conocimiento es cómo nombrar cada tabla de resumen y consultarlos cuando sea necesario concatenarlos.
Además, sería bueno si la secuencia de comandos puede cerrar todas las tablas abiertas (de la parte 1) y las tablas de resumen (de la parte 2), y solo devolver la tabla concatenada. (Con mi script, aparecerían 50 tablas en total, y tengo que cerrarlas manualmente).
Adjunto mis guiones:
Establecer directorio predeterminado ("E: \ Test");
archivos = archivos en el directorio ("E: \ Test");
Para (i = 1, i <= N Artículos (archivos), i ++,
Abierto(
archivos [i],
Hojas de trabajo ("worksheet1"),
Utilizar para todas las hojas (1),
Hojas de trabajo concatenadas (0),
Crear columna de concatenación (0),
Configuración de la hoja de trabajo (
1,
Tiene encabezados de columna (1),
Número de filas en los encabezados (1),
Los encabezados comienzan en la fila (1),
Los datos comienzan en la fila (2),
Inicio de datos en la columna (1),
Los datos terminan en la fila (0),
Los datos terminan en la columna (0),
Replicado de filas esparcidas (1),
Encabezados distribuidos replicados (0),
Suprimir filas ocultas (1),
Suprimir columnas ocultas (1),
Suprimir columnas vacías (1),
Tratar como jerarquía (0),
Pila de series múltiples (0),
Importar colores de celda (0),
Limitar la detección de columnas (0),
Cadena de separador de columna ("-")
)
);
Nueva columna ("Xindex", Fórmula (Techo (: Nombre ("X") /: Nombre ("dimensión X"))));
Nueva columna ("Yindex", Fórmula (Piso (: Nombre ("Y") / : Nombre ("dimensiónY") )));
Resumen(
Grupo(
: Nombre ("X"),
: Nombre ("Y"),
: Xindex,
: Yindex),
Std Dev (: Nombre ("Data1")),
Freq ("Ninguno"),
Peso ("Ninguno")
)
);
Re: Abra 25 tablas, Resumen para cada una y Concatenar todas las tablas de resumen.En el código, usted especifica
dtConcat = dtSum;
Lo que creo que su proceso de pensamiento es, es que está haciendo una copia de la tabla de datos cuando usa esta declaración. Pero infact, dtConcat y dtSum son solo variables, que contienen un puntero a una tabla de datos, y al especificar que dtConcat es igual a dtSum, ambas variables apuntan a la misma tabla de datos.
Y luego especificas
close (dtSum,nosave);
Esto cierra la tabla de datos a la que apunta la variable dtSum. Lo que significa que ahora tanto dtSum como dtConcat ya no tienen una tabla de datos abierta a la que apuntan.
Re: Abra 25 tablas, Resumen para cada una y Concatenar todas las tablas de resumen.Hola Uday,
¡Muchas gracias! Creo que su script me dice cómo usar el punto y coma y la coma en if (): la coma se usa para separar test y expr, el punto y coma se usa para unir múltiples argumentos en un expr. ¿Es esto correcto?
@txnelson
Hola Jim,
Si estoy en lo cierto acerca del uso de coma y punto y coma, espero que la siguiente secuencia de comandos funcione al agregar la línea resaltada.
Sin embargo, con este nuevo script, solo obtuve dt y dtSum cuando i = 2 (agregué otra columna en todas las tablas para rastrear qué "i" está en la tabla actual).
Sin la línea resaltada, tengo dt y dtSum cuando i = 1, y dtConcat cuando se realiza el ciclo for (), tal como lo describí en mi última respuesta.
if(i == 1,
dtConcat = dtSum<FONT color="#FF6600"><STRONG>; close(dtSum,nosave);close(dt,nosave);</STRONG></FONT>,
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave);
);
Re: Abra 25 tablas, Resumen para cada una y Concatenar todas las tablas de resumen.Hola Jim,
¡Muchas gracias! Ahora tengo un poco de sentido de usar referencias en JMP.
Una pregunta más para la función if (). En la siguiente función if () que agregué en mi script, i == 1 es prueba 1, dtConcat = dtSum es expr1, y el resto "dtConcat = dtConcat << ......." es "else expr".
Mi pregunta es ¿cómo puedo agregar varias expresiones para la prueba 1 en if ()? En el primer script, ahora tengo tres tablas de salida,
1) dt cuando i == 1;
2) dtSum cuando i == 1;
3) dtConcat cuando se realiza el bucle for (), que es exactamente lo que necesito.
Ahora solo quiero no informar 1) y 2) después de ejecutar el script, solo informe 3).
Probé el segundo script pero no funciona. Además, ambos scripts dan alertas "No se puede agregar a una tabla de datos derivados o bloqueados".
if(i == 1,
dtConcat = dtSum,
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave)
);
En la segunda secuencia de comandos, intenté 1) cuando i == 1, asigné dtSum a dtConcat, y cerré dtSum y dt; 2) cuando i no es igual a 1, Concat dtSum to dtConcat, y cierra dtSum y dt. Sin embargo, no funciona como esperaba. ¿Supongo que es porque estoy usando la coma y el punto y coma de forma incorrecta?
if(i == 1,
dtConcat = dtSum; close (dtSum,nosave); close (dt, nosave),
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave)
);
Re: Abra 25 tablas, Resumen para cada una y Concatenar todas las tablas de resumen.Solo necesita agregar un paso de concatenación a su código ... algo como esto
Set Default Directory( "E:\Test" );
files = Files In Directory( "E:\Test" );
For( i = 1, i <= N Items( files ), i++,
dt = Open(
files[i],
Worksheets( "worksheet1" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
New Column( "Xindex", Formula( Ceiling( :Name( "X" ) / :Name( "dimensionX" ) ) ) );
New Column( "Yindex", Formula( Floor( :Name( "Y" ) / :Name( "dimensionY" ) ) ) );
dtSum = dt << Summary(
Group( :Name( "X" ), :Name( "Y" ), :Xindex, :Yindex ),
Std Dev( :Name( "Data1" ) ),
Freq( "None" ),
Weight( "None" );
If( i == 1,
dtConcat = dtSum,
dtConcat = dtConcat << concatenate( dtSum, append to first table );
Close( dtSum, nosave );
);
);
);
Re: Abra 25 tablas, Resumen para cada una y Concatenar todas las tablas de resumen. @Zihao ,
Cuando abres una tabla de datos en JMP, una forma de capturar una referencia a ella es haciendo algo como esto:
dt = Open(<YOUR custom="" path="">);</YOUR>
Ahora, dt contiene la referencia a la tabla de datos a la que puede pasar mensajes y emitir comandos. Ahora, otra forma de pasar mensajes a una tabla de datos es si conoce el nombre de la tabla de datos.
Data Table("Big Class") // This is an example Para su pregunta sobre cómo concatenar las tablas de datos, puede usar la siguiente plantilla:
for(i = 1, i <= N Items(files), i++,
dt = Open(<CUSTOM script="" here="">);
If(i == 1,
dt_Results = New Table("Results");
dt_Results = dt;
,
dt_Results << Concatenate(dt,"Append To First Table");
);
);</CUSTOM>