cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadoHola,
Soy novato en JSL, así que agradezco la ayuda.
Tengo tres archivos.
archivo n.º 1: es el archivo de referencia, [como ref.csv] que contiene 3 columnas como se muestra a continuación.
Categoría, ancho, etiqueta
--------------------------------
A,0,L1.abc
A,1,L2.xt
A,2,L8.dr
A,3,L20.ws
A,4,L72.oz
B,0,L11.qq
....
B,6,L61.er
archivo n.° 2: archivo de datos n.° 1 en JMP, que contiene Categoría, Datos y muchas otras columnas.
archivo n.° 3: archivo de datos n.° 2 en JMP, que contiene Categoría, Datos y muchas otras columnas.
La diferencia entre los dos archivos de datos [Archivo n.° 2 y archivo n.° 3] es el tipo de categoría y el ancho del valor en la columna de datos.
Archivo de datos #1:
Categoría|datos|muchas cols.....
----------------------------------------
Un 123,23 ....
Un 321,45 ....
.....
muchas filas
el ancho de los valores en la columna "datos" [excluyendo los puntos] coincide con el # de filas en el archivo #1 para una categoría dada
ejemplo:
ancho de 123.23 en la fila 1 en el archivo de datos #1 es 5.
el número de filas en el archivo de referencia para la categoría A sería 5. Esto no necesita ser probado por ejemplo. así es como entran las tablas [es decir, cuando se extraen de la fuente]
En el futuro, en el archivo de referencia, digamos para la categoría A, el número de filas aumenta a 6 o más, el ancho del valor contenido en la columna de datos en el archivo de datos del archivo #1 también aumentaría cuando la información se extraiga de la base de datos.
Archivo de datos #2:
Categoría|datos|muchas cols.....
----------------------------------------
B 1236.23 ....
B 3213.45 ....
.....
muchas filas
Objetivo 1: crear nuevas columnas dependiendo del ancho del valor contenido en la columna de "datos" en el archivo de datos #1 [y otros archivos de datos]
¡Terminé con la meta #1!
ex:
el archivo de datos actualizado #1 se vería así:
Categoría|datos|c1|c2|c3|c4|c5|muchas columnas.....
----------------------------------------
A 123.23 1 2 3 2 3 ....
A 321.45 3 2 1 4 5 ....
.....
objetivo 2: cambiar el nombre de las nuevas columnas en el archivo de datos #1 [es decir, c1 a c5] a L1... a L72... como se define en la columna "etiqueta" en el archivo de referencia. no hay cambios en los valores de las celdas, solo actualice los nombres de las columnas seleccionadas.
resultado esperado después de que se cumpla el objetivo 2:
Actualice el archivo de datos #1 para que se vea así:
Categoría|datos|L1.abc|L2.xt|L8.dr|L20.ws|L72.oz|muchas cols.....
----------------------------------------
A 123.23 1 2 3 2 3 ....
A 321.45 3 2 1 4 5 ....
.....
Necesito ayuda con la meta #2.
Para el objetivo n.º 2, abrí el archivo de referencia, pero no estoy seguro de seguir adelante.
Gracias
David
Acceso a los datosLa personalización en masaRe: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadoOK... esto es un poco quisquilloso... pero lo que está en dataTablesList no es una lista de nombres de tablas de datos sino funciones de tabla de datos(), que apuntan a tablas de datos.
{"Table1","Table2"} // Una lista de nombres de tablas de datos
{ tabla de datos ("Tabla1"), tabla de datos ("Tabla2") } // una lista de punteros a tablas de datosRe: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadosí. entiendo. contiene el nombre de la tabla de datos
-David
Re: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadodataTableList no contiene las tablas de datos, solo contiene punteros a las tablas. Crear la lista y luego ejecutar
Show( dataTableList );
y verás lo que hay en la lista.
También puede ver lo que hay en la lista, simplemente pasando el mouse sobre la variable, y mostrará su valor
Re: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadogracias jim ¡Con cambios menores [a mis necesidades] funciona! Gracias !!
Pregunta, ¿puede la lista [datatableList] contener mucha información?
Cada una de mis tablas tiene muchas filas como en miles y también tiene muchas columnas.
-David
Re: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadoLo siento por mi información errónea.Leí mal la estructura de la tabla de datos de Categorías.A continuación se muestra un script que crea un par de tablas de datos y una tabla de categorías y luego expande las tablas de datos y finalmente cambia el nombre de las columnas según las entradas en la tabla de datos de categorías.Espero que esto nos vuelva a poner en marcha.El script funcionará en tantas tablas de datos como sea necesario.Todo lo que hay que hacer es agregar a la lista dataTableList todas las tablas de datos que se van a procesar.
Names Default To Here( 1 );
// This example script opens up 2 data tables and 1 category table.
// In reality, as many as necessary data tables could be used
// Create the tables
dt1 = New Table( "Table1",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"ABC", "ABC", "ABC"} ) ),
New Column( "DATA", Character( 33 ), "Nominal", Set Values( {"123.56.8.342", "431.02.0.567", "318.00.1.816"} ), Set Display Width( 182 ) )
);
dt2 = New Table( "Table2",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"B", "B", "B"} ) ),
New Column( "Data", Character, "Nominal", Set Values( {"13.24", "98.44", "63.89"} ) )
);
dtCat = New Table( "The Categories",
Add Rows( 13 ),
New Column( "Category",
Character,
"Nominal",
Set Values( {"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "B", "B", "B", "B"} ),
Set Display Width( 67 )
),
New Column( "Width", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3] ) ),
New Column( "Label",
Character( 16 ),
"Nominal",
Set Values(
{"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7", "label0.8", "thelabel.1", "thelabel.2",
"thelabel.3", "thelabel.4"}
),
Set Display Width( 99 )
)
);
// Below this line, is the script that will add the new columns to each of the data tables
// and will take the names from the dtCat (Categories) data table and change the names to
// the columns in each of the data tables
// Create a list of the pointers to the data tables. This will allow for the using of the list
// entries to point to the data tables using a subscript
dataTableList = {};
insert into(dataTableList, dt1 );
insert into(dataTableList, dt2 );
// Loop across the data table list and expand the columns based upon the the column called Data
For( i = 1, i <= N Items( dataTableList ), i++,
ncols_to_add = length( substitute((dataTableList[i]:Data)[1],".",""));
For( k = 1, k <= ncols_to_add, k++, // the || operator joins two strings
dataTableList[i] << New Column( "c" || Char( i ),
Numeric,
Continous,
<<SET each="" value=""></SET>Re: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadoJim,
Para el paso 2 con las siguientes modificaciones [que se muestran a continuación]
++++
esta es mi ref.csv:
categoría|ancho|etiqueta
ABC 0 etiqueta0.0
ABC 1 etiqueta0.1
ABC 2 etiqueta0.2
ABC 3 etiqueta0.3
ABC 4 etiqueta0.4
Etiqueta ABC 50.5
Etiqueta ABC 60.6
Etiqueta ABC 70.7
Etiqueta ABC 80.8
Etiqueta ABC 90.9
Etiqueta ABC 100.10
ABC 11 etiqueta0.11
ABC 12 etiqueta0.12
ABC 13 etiqueta0.13
ABC 14 etiqueta0.14
Etiqueta ABC 151.15
Etiqueta ABC 160.16
Etiqueta ABC 170.17
Etiqueta ABC 180.18
Etiqueta ABC 190.19
Etiqueta ABC 200.20
B 0 etiqueta 11.22
C 1 etiqueta 11.21
D 2 etiqueta 11.23
E 0 etiqueta 11.24
Mi código:
dt_ref = Abrir ("ref.csv");
Para( i=1, i<= N filas( dt_ref ), i++,
insertar en(Categoría_Lista, palabra(1,:etiqueta[i],".") || "." || palabra(2,:etiqueta[i], "." ) );
);
mostrar (Categoría_Lista);
+++
Recibo lo siguiente en el registro:
Category_List = {"etiqueta0.0", "etiqueta0.1", "etiqueta0.2", "etiqueta0.3", "etiqueta0.4", "etiqueta0.5", "etiqueta0.6", "etiqueta0.7" , "etiqueta0.8", "etiqueta0.9", "etiqueta0.10", "etiqueta0.11", "etiqueta0.12", "etiqueta0.13", "etiqueta0.14", "etiqueta1.15", " label0.16", "label0.17", "label0.18", "label0.19", "label0.20", "label11.22", "label11.21", "label11.23", "label11. 24", ".", "."};
Quiero que seleccione las etiquetas solo cuando la categoría sea ABC. ¿Cómo puedo hacer eso?
Intenté lo siguiente pero no se devuelve nada para Category_List:
producto_encontrado ={"ABC"};
if (:producto == producto_encontrado,
Para( i=1, i<= N filas( dt_ref ), i++,
insertar en(Categoría_Lista, palabra(1,:nombre[i],".") || "." || palabra(2,:nombre[i], "." ) );
);
);
Gracias,
David
Re: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadoHe mirado el código que has proporcionado... Parece que hay cierta confusión.
asi lo intercepto y me corrigen que esta mal.
dtcat es la tabla de referencia con nombre de columna [ Categoría, ancho, etiqueta].
hay múltiples tablas de datos dt1, dt2, etc. con la misma estructura con nombres de columnas [Categoría | datos | muchas columnas .....]
cuando ejecuto el codigo no hace nada
no hay ninguna columna con nombre de datos en la tabla dtcat y analicé la depuración.
Puede ser que te refieras a la tabla dt1 ya que es una columna de datos.
Intenté jugar y no sirvió de nada.
Creo que estamos alineados con las definiciones en la tabla, use lo que describí en la publicación original, podría ayudar en mi opinión.
Nuevamente agradezco la ayuda aquí.
Déjame la recomendación para el paso 2
Gracias
David
Re: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separado- Usted indica que mi último código no funciona... ¿por qué no?
- Aquí hay una manera de crear la lista que está solicitando
Category_List = {};
For( i=1, i<= N Rows( dtCat ), i++,
insert into(Category_List, word(3,:data[i],".") || "." || word(4,:data[i], "." ) );
);
Re: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadogracias jimNo está trabajando.
Entonces, para el objetivo n.º 2, he desglosado toda la lógica en pasos de valores.
paso 1: obtenga los nombres de categoría de la tabla de datos [digamos dt1] y guárdelos en una variable [digamos que contiene la categoría A] - HECHO
paso 2: lea la variable del paso 1 y encuentre todas las filas que coincidan con la categoría = A] obtenga los nombres de las etiquetas de la columna "Etiqueta" de ref.csv, [que ha llamado como dtCat], y guárdelo en una lista o variable. [dígalo llamado lista_de_categorías]
usando el ejemplo indicado en la discusión. Espero que category_list mantenga los valores por debajo.
lista_de_categorias = L1.abc, L2.xt, L8.dr, L20.ws, L72.oz
No se como hacer esto. Agradezco ayuda.
paso 3: Verifique el conteo en la lista == no. de nuevas columnas creadas en el dt1. esto es algo extra que estoy haciendo por robustez.
contar en category_list es 5 elementos
las nuevas columnas creadas en dt1 son 5. [Obtuve esto del objetivo 1 porque tengo una variable para encontrar cuántas columnas nuevas se necesitan].
Paso 4: reemplace los nombres de las columnas en dt1, es decir, c[i] con la lista [i] usando el ciclo donde i = 5
c1 reemplazado
Ahora estoy en el paso 2 y necesito ayuda.
Gracias,
David
Re: cambiar el nombre de las columnas en un archivo jmp según los valores de las filas en un archivo .csv separadoAquí hay un script no probado, que debería estar bastante cerca de poder cumplir con su segundo objetivo
dtCat = Data Table( "file#1 name" );
dt1 = Data Table( "file#2 name" );
dt2 = Data Table( " file#3 name" );
// add dt3, dt4 etc. for each of the categories you have
// Find the number of data tables to process....A B C......
// Create a temporary new column in data table dtCat that has just the category
dtCat << New Column( "temp", character, formula( Word( 1, :data, "." ) ) );
// Summarize the data getting one element in the ByGroup list for each Category found
Summarize( dt, Categories = ByGroup( :temp ) );
numCategories = N Items( Categories );
For( i = 1, i <= numCategories, i++,
// Subset the dtCat table into the a new data table with just the one
// category being processed
dtCat << select where( :temp == Categories[i] );
dtSub = dtCat << subset( selected rows == 1, selected columns( 0 ) );
// set the offset of where to start the renaming
offset = 3;
// Loop
// Change names in dt1 to match the Label in
For( k = 1, k <= N Rows( dtSub ), k++,
Eval(
Substitute(
Expr(
Column( __dt__, k + offset ) << set name( Word( 3, dtSub:Data[k], "." ) ),
Expr( __dt__ ),
Parse( "dt" || Char( i ) )
)
)
)
);
Close( dtSub, nosave );
);