Extraer una cadena de caracteres de diferentes longitudes y posicionesQuiero extraer cadenas de caracteres de una variable (Dx1), pero la longitud y posición de las cadenas varía, pero están separadas por guiones. A veces hay varios guiones. Por ejemplo...
"7812-abcdef-9"
"v7892-xyz-0"
"812-fghkj-0"
"17361-gf-jhyt-9"
Lo que me gustaría hacer es crear una nueva variable que extraiga los dígitos/caracteres antes del primer guión, y luego otra variable que extraiga los caracteres entre el primer y segundo guión.Entonces,
Var1 Var2
7812 abcdef
v7892 xyz
812 fghkj
17361 gf-jhyt
Intenté seguir el ejemplo publicado aquí, pero simplemente extrajo el guión. Cambiar el +1 a otro número exige esa cantidad de caracteres, pero la longitud de mis datos varía.
https://community.jmp.com/t5/Uncharted/JSL-Character-String-Functions/ba-p/21323
Esto es lo que escribí. ¿Qué estoy haciendo mal?
Trim(
Substr(
:Name( "Dx1" ),
Contains( :Name( "Dx1" ), "-" ),
1
)
)
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesEl expresión regular() La función podría ser una alternativa eficiente aquí si experimenta problemas de estabilidad o rendimiento (y un bucle while que se vuelve infinito en una fórmula de columna puede ser frustrante de depurar).
//Formula for Var1
Regex(Dx1, "(^.*?)-", "\1");
//Formula for Var2
Regex(Dx1, "-(.+)-\d", "\1");
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesGracias de nuevo, Jim.
He usado muchas más filas que esta. Era sólo una hipótesis.
Cada caso de DX1 termina en un número, pero la cantidad de espacios entre lo que estoy extrayendo para Var2 y ese número varía. Quizás eso fue lo que lo causó. De cualquier manera, tu solución funcionó.
Re: Extraer una cadena de caracteres de diferentes longitudes y posiciones65.000 filas no es una tabla muy grande para que la maneje JMP.JMP puede manejar tablas de datos con miles de millones de filas.El problema son las inconsistencias de datos en su tabla de datos.El código supone que se encontrará al menos un campo numérico después de encontrar los valores de caracteres para Var2. Aparentemente existe una situación en la que un valor de Dx1 no termina en números.El siguiente es un cambio en el formato que se ajusta a ese problema.
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1 & Word( i, :Dx1, "-" ) != "",
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesGracias, Jim. Así lo probé anteriormente. Por alguna razón, JMP Pro 13 parece bloquearse cuando lo ejecuto. ¿Quizás porque mi tabla de datos tiene 65.000 líneas?
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesEl código incluido es una fórmula de columna.Adjunté una tabla de datos con la columna Dx1 que usó en su ejemplo, junto con las nuevas columnas Var1 y Var2 que tienen sus fórmulas de columna especificadas.
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesGracias, Jim. Eso es lo que estaba buscando.
¿Cómo ejecuto este script? Lo probé como fórmula de columna. Eso no funcionó, pero no esperaba que lo hiciera. También abrí una ventana de secuencia de comandos y la ejecuté allí, pero dejó de responder.Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesAquí tienes una fórmula que hará lo que indicaste como regla...
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1,
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
Sin embargo, en el ejemplo anterior, el ejemplo "17361-gf-jhyt -9" termina con un valor Var2 de "gf-jhyt".¿Es eso lo que quieres?
De todos modos, espero que pueda ver que puede construir una fórmula tan compleja como sea necesario para analizar la cadena en los valores correctos.La única limitación es que debe poder determinar las reglas que deben utilizarse.
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesLa única regla que se me ocurre que sería consistente sería que la segunda palabra aparezca entre números (#). En última instancia, quiero la frase entre guiones. Entonces, "#-palabra -#" y "#-palabra-palabra -#" y "#-palabra-palabra -#"
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesJSL permitirá la construcción y análisis de cualquiera de estas condiciones complejas.Depende de los humanos determinar cuáles son las reglas para dicho análisis.
En su ejemplo, ¿cuál es la regla para determinar qué valores con guiones deben leerse como un valor combinado y cuándo tratarlos como valores separados?
Re: Extraer una cadena de caracteres de diferentes longitudes y posiciones¿Hay alguna manera de hacer que WORD ignore algunos guiones? Algunas de las segundas palabras que intento extraer están divididas con guiones, por lo que solo obtengo una extracción parcial. Por ejemplo, para "938-ex-marine" obtengo "938" y "ex" en lugar de "ex-marine".
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesEl palabras La función es tu amiga aquí.Utilice el guión y el espacio como delimitadores y podrá extraer lo que desee fácilmente.A continuación se muestra un ejemplo que utiliza fórmulas en una tabla:
dt = New Table( "Untitled", Add Rows( 4 ),
New Column( "dx1", Character, "Nominal",
Set Values( {"7812-abcdef -9", "v7892-xyz -0", "812-fghkj -0",
"17361-gf-jhyt -9"}
)
),
// Get the first word for Var1
New Column( "Var1", Character, "Nominal", Formula( Words( :dx1, "- " )[1] ) ),
// Get the second word for Var1
New Column( "Var2", Character, "Nominal", Formula( Words( :dx1, "- " )[2] ) )
);Re: Extraer una cadena de caracteres de diferentes longitudes y posiciones¡Gracias! Eso funciona bien.
Re: Extraer una cadena de caracteres de diferentes longitudes y posicionesQuiere utilizar la función Word().Si crea una nueva columna, "Var1", y coloca la siguiente fórmula en la columna, obtendrá los resultados que desea
word(1,:Dx1,"-")
Para Var2 sería:
word(2,:Dx1,"-")
La función Word() está documentada en el índice de secuencias de comandos.
Ayuda==>Índice de secuencias de comandos==>Word
Re: Extraer una cadena de caracteres de diferentes longitudes y posiciones@jswislar :
Una forma de abordar esto podría ser utilizar las funciones Contiene y Substr.
a = {"abc-12","abc - 45","abc- 89"};
List1 = list();
List2 = list();
For(i = 1 , i <= N Items(a), i++,
Pos = Contains(a[i],"-");
Insert Into(List1,Substr(a[i],1,Pos-1));
Insert Into(List2,Substr(a[i],Pos+1,Length(a[i])));
);