cambiar el nombre de los nombres de las columnas en un archivo jmp según los valores en las filas en un archivo .csv separadoHola,
Soy novato en JSL, así que agradezco la ayuda.
Tengo tres archivos.
file # 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 # 3: archivo de datos # 2 en JMP, que contiene Categoría, Datos y muchas otras columnas.
La diferencia entre los dos archivos de datos [Archivo # 2 y archivo # 3] es el tipo de categoría y el ancho del valor en la columna de datos.
Archivo de datos n. ° 1:
Categoría | datos | muchas columnas .....
----------------------------------------
Un 123.23 ....
A 321,45 ....
.....
muchas filas
el ancho de los valores en la columna "datos" [excluyendo los puntos] coincide con el número de filas del archivo número 1 para una categoría determinada
ejemplo:
el 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 decir. 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 número 1 también aumentará cuando se extraiga información de la base de datos.
Archivo de datos # 2:
Categoría | datos | muchas columnas .....
----------------------------------------
B 1236.23 ....
B 3213.45 ....
.....
muchas filas
Objetivo 1: crear nuevas columnas en función del ancho del valor contenido en la columna "datos" en el archivo de datos n. ° 1 [y otros archivos de datos]
¡Terminé con el objetivo # 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. sin 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 n. ° 1 para que se vea así:
Categoría | datos | L1.abc | L2.xt | L8.dr | L20.ws | L72.oz | muchas columnas .....
----------------------------------------
A 123,23 1 2 3 2 3 ....
A 321,45 3 2 1 4 5 ....
.....
Necesito ayuda con el objetivo n. ° 2.
Para el objetivo n. ° 2, abrí el archivo de referencia, pero no estoy seguro de seguir adelante.
Gracias
David
Tabla de datosRe: cambiar el nombre de los nombres de las columnas en un archivo jmp según los valores en las filas en un archivo .csv separadoAquí hay una secuencia de comandos no probada, 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 );
);Re: cambiar el nombre de los nombres de las columnas en un archivo jmp según los valores en las filas en un archivo .csv separadoGracias Jim.No está trabajando.
Entonces, para el objetivo n. ° 2, he dividido toda la lógica en pasos de valores.
paso 1: obtenga los nombres de las categorías de la tabla de datos [digamos dt1] y almacénelos en una variable [digamos que tiene la categoría A] - HECHO
paso2: lea la variable del paso1 y busque todas las filas que coincidan con la categoría = A] obtenga los nombres de las etiquetas de la columna "Etiqueta" del ref.csv, [que ha llamado dtCat], y guárdelos en una lista o variable. [diga que se llama category_list]
usando el ejemplo indicado en la discusión. Espero que category_list mantenga los valores inferiores.
category_list = L1.abc, L2.xt, L8.dr, L20.ws, L72.oz
No se como hacer esto. Agradezco la ayuda.
paso 3: Verifique el recuento en la lista == no. de nuevas columnas creadas en el dt1. esto es algo adicional que estoy haciendo por robustez.
contar en category_list es 5 elementos
los nuevos cols creados en dt1 son 5. [Obtuve esto del objetivo 1 ya que 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 list [i] usando el bucle donde i = 5
c1 reemplazado
Ahora mismo estoy en el paso 2 y necesito ayuda.
Gracias,
David
Re: cambiar el nombre de los nombres de las columnas en un archivo jmp según los valores en las filas en un archivo .csv separado- Indicas que mi último código no funciona ... ¿por qué no?
- A continuación se muestra una forma de crear la lista que solicita
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 los nombres de las columnas en un archivo jmp según los valores en las filas en un archivo .csv separadoMiré el código que me ha proporcionado. Parece que hay cierta confusión.
así es como me intercepté y me corrigió, está mal.
dtcat es la tabla de referencia con nombre de columna [ Categoría, ancho, etiqueta].
hay varias tablas de datos dt1, dt2, etc. con la misma estructura con nombres de columnas [Categoría | datos | muchas columnas ...]
cuando ejecuto el código, no hace nada
no hay datos con nombre de columna en la tabla dtcat y se examinó la depuración.
Puede que te refieres 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 sobre la mesa, 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 los nombres de las columnas en un archivo jmp según los valores en las filas en un archivo .csv separadoJim
Para el paso 2 con las siguientes modificaciones [se muestra a continuación]
++++
este es mi ref.csv:
categoría | ancho | etiqueta
ABC 0 etiqueta 0.0
Etiqueta ABC 1 0.1
Etiqueta ABC 2 0,2
Etiqueta ABC 3 0.3
Etiqueta ABC 4 0.4
Etiqueta ABC 5 0.5
Etiqueta ABC 6 0.6
Etiqueta ABC 7 0,7
Etiqueta ABC 8 0.8
Etiqueta ABC 9 0.9
Etiqueta ABC 10 0.10
Etiqueta ABC 11 0.11
Etiqueta ABC 120,12
Etiqueta ABC 13 0.13
Etiqueta ABC 14 0.14
Etiqueta ABC 15 1,15
Etiqueta ABC 16 0.16
Etiqueta ABC 17 0,17
Etiqueta ABC 18 0.18
Etiqueta ABC 19 0,19
Etiqueta ABC 200,20
Etiqueta B 011.22
Etiqueta C 1 11.21
Etiqueta D 2 11,23
E 0 etiqueta11.24
Mi código:
dt_ref = Abierto ("ref.csv");
Para (i = 1, i <= N filas (dt_ref), i ++,
insertar en (Category_List, word (1,: label [i], ".") || "." || palabra (2,: etiqueta [i], "."));
);
mostrar (Category_List);
+++
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", " etiqueta0.16 "," etiqueta0.17 "," etiqueta0.18 "," etiqueta0.19 "," etiqueta0.20 "," etiqueta11.22 "," etiqueta11.21 "," etiqueta11.23 "," etiqueta11. 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:
prod_found = {"ABC"};
si (: producto == prod_found,
Para (i = 1, i <= N filas (dt_ref), i ++,
insertar en (Category_List, palabra (1,: nombre [i], ".") || "." || palabra (2,: nombre [i], "."));
);
);
Gracias,
David
Re: cambiar el nombre de los nombres de las columnas en un archivo jmp según los valores en las filas en un archivo .csv separadoPerdón por mi desinformación.Leí mal la estructura de la tabla de datos de Categorías.A continuación se muestra una secuencia de comandos 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 encaminar.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 procesarán
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>