¿Necesita ayuda con la programación JSL para dividir datos de columnas con un delimitador y hacer coincidirlos con otro delimitador de columnas? Dividir datosHola, chicos
Estoy usando JMP17 y realmente necesito ayuda con el script JSL para procesar los datos de entrada a continuación en los datos de salida deseados.
Tabla de datos de entrada:
| Datos| Etiqueta | ID |
|----------|----------|----------|
| 1_1_64_5_2 | D1_DD4_FF1_FIN1_GPES2 | Manzana1 |
| 1_1_2 | D2_D3_D4 | Manzana1 |
| 1_2_68_5_6 | D1_DD4_FF1_FIN1_GPES2 | Naranja1 |
| 1_2_2 | D2_D3_D4 | Naranja1 |
| 2_1_50_3_10 | D1_DD4_FF1_FIN1_GPES2 | Uva1 |
| 2_1_2 | D2_D3_D4 | Uva1 |
Formato de salida: (la disposición de la secuencia de columnas no importa)
| ID| Etiqueta| Datos|
|----------|----------|----------|
| Manzana1 | D1 | 1 |
| Manzana1 | DD4 | 1 |
|Manzana1|FF1|64|
|Manzana1|FIN1|5|
|Manzana1|GPES2|2|
| Manzana1 | D2 | 1 |
| Manzana1 | D3 | 1 |
| manzana1 | D4 | 2 |
| Naranja1| D1 | 1 |
| Naranja1| DD4 | 2|
| Naranja1| FF1 | 68|
| Naranja1| FIN1 | 5 |
| Naranja1| GPES2 | 6 |
| Naranja1| D2| 1 |
| Naranja1| D3| 2 |
| Naranja1| D4 | 2 |
| Uva1 | D1 | 2 |
| Uva1 | DD4 | 1|
| Uva1 | FF1 | 50|
| Uva1 | FIN1 | 3 |
| Uva1 | GPES2 | 10 |
| Uva1 | D2 | 2 |
| Uva1 | D3| 1 |
| Uva1 | D4 | 2 |
Automatización y scriptingAnálisis y modelado de datos básicosAcceso a datosRe: Necesito ayuda con la programación JSL para dividir datos de columnas con un delimitador y hacer coincidirlos con otro delimitador de columnas Dividir datos¿Puedes proporcionar una tabla de ejemplo? Es un poco difícil comprender la situación inicial a partir del texto únicamente.
Re: Necesito ayuda con la programación JSL para dividir datos de columnas con un delimitador y hacer coincidirlos con otro delimitador de columnas Dividir datosSupongo que todos los valores de etiquetas y datos tienen la misma cantidad de elementos. Si es así, esto funcionaría. Si no, sería necesario agregar un poco más de lógica para verificarlo, pero esta sería una forma rápida de procesar sus datos.
// this would be whatever your input table name is<BR />dt0 = Data table("Input Table");
dt1 = new table("Output table");
dt1<<NEW column=""></NEW>Re: Necesito ayuda con scripts JSL para dividir datos de columnas con delimitadores y hacer coincidir con otro delimitador de columnas Dividir datosNo estoy seguro de cuál es el punto de partida, así que asumiré que tienes una tabla de datos y no un archivo de texto.

Seleccione las columnas Datos y Etiqueta y utilice Texto en columnas en ellas

Elimina esas columnas "viejas" (o muévelas al final).
A continuación, apile sus datos utilizando la pila de series múltiples

Eliminar columnas adicionales, reordenar y cambiar el nombre de las columnas

Eliminar filas faltantes

Verifique los resultados y tome el script que JMP creó para usted (o flujo de trabajo).
También se adjunta un flujo de trabajo (puede requerir algo de limpieza) y un script limpio basado en el flujo de trabajo a continuación (se puede hacer mucho más sólido según sus necesidades):
Ver más...
Names Default To Here(1);
dt = Current Data Table();
dt << Text to Columns(columns(:" Data"n, :Label), Delimiters("_"));
dt << Delete Columns(:" Data"n, :Label);
dt_stacked = dt << Stack(
columns(:Data 1, :Data 2, :Data 3, :Data 4, :Data 5, :Label 1, :Label 2, :Label 3, :Label 4, :Label 5),
Number of Series(2),
Contiguous,
Output Table("Stacked result")
);
dt_stacked << Delete Columns(:Label, :Label 2);
Column(dt_stacked, "Data 2") << Set Name("Label");
dt_stacked << Move Selected Columns({:Label}, after(:ID));
dt_stacked << Select Where(:Label == "") << Delete Rows;
Re: Necesito ayuda con scripts JSL para dividir datos de columnas con delimitadores y hacer coincidir con otro delimitador de columnas Dividir datosAlgunas mejoras que sugeriría:
- Generalmente no use la tabla de datos actual(). En este caso, podría seleccionar la tabla inicial usándola, pero no debería ser necesario modificarla constantemente, ya que ya tiene las referencias (por ejemplo, la tabla de datos actual(dt1); es innecesaria y podría causar problemas).
- Recorra una tabla específica cuando utilice For Each Row y no confíe en la tabla actual (for each row(dt0,...)
- También puedes usar For Each + Across para recorrer varios contenedores. También puedes forzar diferentes comportamientos al usar Across para gestionar contenedores de diferentes longitudes.
- Si conoce los nombres de las columnas + valores, ya puede agregar valores con << Agregar filas, pero puede ser un desastre (normalmente agrego filas como lo hizo usted y agrego los valores después)
Ver más...
Names Default To Here(1);
dt_input = Current Data Table();
// dt_input = Data table("Input Table");
dt_result = New Table("Output table");
dt_result << New Column("ID", Character, Nominal);
dt_result << New column("Label", Character, Nominal);
dt_result << New Column("Data", Character, Nominal);
For Each Row(dt_input,
id_val = Column(dt_input, "ID")[];
data_vals = Words(Column(dt_input, "Data")[], "_");
label_vals = Words(Column(dt_input, "Label")[], "_");
For Each({{cur_label, cur_data}}, Across(label_vals, data_vals),
dt_result << Add Rows({ID = id_val, Label = cur_label, Data = cur_data});
);
);