Extraiga números de diferentes longitudes de una cadena en diferentes columnasTengo una columna llamada Duración con valores que representan el número de días, horas, minutos y segundos. La última m denota segundos.
Así que el formato típico sería: (0-365)d(0-24)h(0-60)m(0-60)m
Aquí hay unos ejemplos.:
0d 15h 47m 43m
10d 10h 21m 54m
0d 04h 07m 32m
268d 06h 02m 33m
Necesito extraer la cantidad de días, horas, minutos y segundos en diferentes columnas para poder realizar cálculos en él.
Probé la fórmula para extraer el número de días,
Words( :Duration, "d" )[1]
Para extraer el segundo número, utilicé la fórmula:
Substr( Item( 2, :Duration ), 1, 2 );
De la misma manera extrajo el tercer y cuarto número usando 3 y 4 en la fórmula del Ítem.
Para convertir estas cadenas a numéricas, creé 4 columnas más; copié y pegué y cambié el tipo de datos a numérico.
Entiendo que esta es una forma indirecta de llegar al resultado.
Me preguntaba si alguien podría ayudarme de una manera más eficiente.
Tabla de datossecuencias de comandosRe: Extraer números de diferentes longitudes de una cadena en diferentes columnasMuchas gracias por señalarme el registro. Vi el resultado allí. Anteriormente estaba pensando que el resultado se mostraría en una ventana separada.
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnasMarca
Tenía la impresión de que el resultado se mostrará en una ventana separada. Ahora, miré en el registro y vi el resultado allí, ya que muchas veces había ejecutado el script.
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnas@txnelson es correcto. Le mostró cómo usarlo como un script separado. Esta expresión es todo lo que necesita para una fórmula de columna:
Num( Regex( cell[i], "(\d+)d (\d+)h (\d+)m (\d+)m", "\1" ) )
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnas@Mark_Bailey script es un JSL independiente.Lo ejecuta colocándolo en una ventana de secuencia de comandos y ejecutando la secuencia de comandos.Hice eso y funcionó muy bien, dando los siguientes resultados en el registro de JMP
day = 0;
day = 10;
day = 0;
day = 268;
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnasMarca,
Intenté usar tu script de muchas maneras diferentes.
a) usando el script en el editor de scripts y ejecutándolo,
b) crear una columna con el nombre "celda" e ingresar la lista de elementos en ella + crear otra columna "día" y usar el "bucle for" como fórmula en esa columna,
y otras maneras.
me sale un error
También intenté buscar ayuda en el índice de secuencias de comandos.
Pero no puedo hacer que el script funcione.Soy nuevo en scripting. ¿Puedes ayudarme?
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnasHas obtenido algunas buenas soluciones hasta ahora, pero señalaría que estabas muy cerca con el uso de la Palabras() función.
Puede especificar más de un delimitador en el último argumento de la función Words() para poder hacer esto:
vals={"0d 15h 47m 43m", "10d 10h 21m 54m","0d 04h 07m 32m", "268d 06h 02m 33m"};
for (i=1, i<=nitems(vals), i++,
show(words(vals[i], "dhm ")) //use "d" "h" "m" and a space as delimiters
);
En el registro:
/*:
Words(vals[i], "dhm ") = {"0", "15", "47", "43"};
Words(vals[i], "dhm ") = {"10", "10", "21", "54"};
Words(vals[i], "dhm ") = {"0", "04", "07", "32"};
Words(vals[i], "dhm ") = {"268", "06", "02", "33"};
Aquí está en el editor de fórmulas, junto con el En Días(), En Horas(), En Minutos() funciones para convertir los valores numéricos en el número de segundos en cada una de esas unidades, para crear una columna de Duración.

He adjuntado la tabla de datos aquí también.
Este tema combina dos de mis funciones favoritas, la función Word() (o Words()) y las fechas y horas. Aquí hay publicaciones que escribí explicando cada uno de ellos:
Si aprende solo una función del Editor de fórmulas, Word() es la única
Uso de fechas, horas, fechas y duraciones en JMP
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnasPaul- Aprendí una nueva función. ¡Muchas gracias por su versión detallada y simplificada de la solución!
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnasPerfecto. Muchas gracias por tu descripción y capturas de pantalla. Me ahorró tiempo en otros casos usando recode.
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnasUtilice Recodificar -Columna de fórmula- en la zona activa Nuevos valores, seleccione Avanzado - Extraer segmento. Capturas de pantalla para extraer archivos d, sec y jmp con fórmula guardada para día, hora, segundo adjunto.


Re: Extraer números de diferentes longitudes de una cadena en diferentes columnasEste ejemplo ilustra cómo usar expresiones regulares.
Names Default To Here( 1 );
cell = {"0d 15h 47m 43m", "10d 10h 21m 54m", "0d 04h 07m 32m", "268d 06h 02m 33m"};
For( i = 1, i <= N Items( cell ), i++,
day = Num( Regex( cell[i], "(\d+)d (\d+)h (\d+)m (\d+)m", "\1" ) );
Show( day );
);Re: Extraer números de diferentes longitudes de una cadena en diferentes columnasTabla de muestra adjunta.
Re: Extraer números de diferentes longitudes de una cadena en diferentes columnas¿Qué hay de usar Regex:
Por el dia:
Num( Regex( :Duration, "(\d+)d\s(\d+)h\s(\d+)m\s(\d+)m", "\1" ) )
Por la hora:
Num( Regex( :Duration, "(\d+)d\s(\d+)h\s(\d+)m\s(\d+)m", "\2" ) )
Por el Minuto:
Num( Regex( :Duration, "(\d+)d\s(\d+)h\s(\d+)m\s(\d+)m", "\3" ) )
Para el segundo:
Num( Regex( :Duration, "(\d+)d\s(\d+)h\s(\d+)m\s(\d+)m", "\4" ) )
Cada número está en un grupo de captura, aunque realmente no es necesario capturar los demás. Podrías simplificarlo con estos:
Num( Regex( :Duration, "(\d+)d\s\d+h\s\d+m\s\d+m", "\1" ) )
Num( Regex( :Duration, "\d+d\s(\d+)h\s\d+m\s\d+m", "\1" ) )
Num( Regex( :Duration, "\d+d\s\d+h\s(\d+)m\s\d+m", "\1" ) )
Num( Regex( :Duration, "\d+d\s\d+h\s\d+m\s(\d+)m", "\1" ) )