Extraer texto de una cadenaHola,
Si es posible, me gustaría extraer un texto particular de las cadenas:
\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hola TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hola TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hola TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hola YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hola TT-YYT (CTL1008.1)
y quiero extraer las identificaciones de arriba:
CTL1083.1
CIL0858.1
CTL1077.1
CMA0851.1
CMS0499.1
CTL1078
CTLR1073
CTLR0999.1
CTL1008.1
Cualquier ayuda apreciada.
Gracias,
tomasz
Ingeniería de Calidad y ProcesosRe: Extraer texto de una cadena¡Shh!@Craige_Hales , por favor no digas @Byron_JMP . Realmente herirás sus sentimientos. (Piel delgada me temo)
Re: Extraer texto de una cadena¿Coincidencia de patrones dices? Qué tal esto
Names Default to Here(1);
sample = "\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)";
charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.";
idList = {};
Pat Match(sample,"(" + Pat Span(charSet)>>nextID + (")" | "\!r") + Pat Test(Insert Into(idList,nextID);0));
Es lamentable que no haya más documentación de soporte para aprender a usar la coincidencia de patrones. Yo era un "¿Por qué molestarse con la coincidencia de patrones cuando tienes Regex?" persona hasta que comencé a comprenderlo mejor y apreciarlo (gracias @Craige_Hales !). Es increíblemente rápido y compacto. Para explicar el código anterior, Coincidencia de palmaditas está buscando un paréntesis abierto seguido de uno o más caracteres de charSet seguido del paréntesis de cierre o de un retorno de carro. Los resultados de palmoteo se almacenan en la variable ID siguiente . Cada vez que se encuentra el patrón, Prueba de palmaditas se utiliza para insertarlo en lista de id . El 0 al final de Prueba de palmaditas le permite continuar buscando la cadena de entrada desde la posición inmediatamente posterior al último carácter de la cadena coincidente (pero antes del siguiente carácter). Si la última declaración en Prueba de palmaditas se hubiera evaluado como verdadero (cualquier cosa que no sea 0), la búsqueda habría terminado, devolviendo solo la primera coincidencia.
Re: Extraer texto de una cadenaMe gusta la simplicidad de word() o words() cuando funciona. Escribí sobre munger aquí y ya no entiendo cómo usarlo. Creo que está en JMP porque estaba disponible en Mac en 1990... no porque fuera un ejemplo de una buena manera de manipular cadenas.
Re: Extraer texto de una cadenamuy agradable, todas las sugerencias funcionan la magia.
He usado Munger en mi guión y funciona perfectamente.
Muchas gracias
tomasz
Re: Extraer texto de una cadenaVaya, muchas formas de rebanar una hogaza de pan en JMP.
Re: Extraer texto de una cadena@pmroz , su código siempre se ve mucho menos desordenado que el mío ; )
Substring (substr) es un enfoque más sencillo, simplemente no puedo resistir un buen caso para munger.
Craig Hales probablemente tenga algunos enfoques aún más eficientes utilizando la coincidencia de patrones. Estoy seguro de que ya hay algunos ejemplos en las páginas de la comunidad o en su página de blog.
Re: Extraer texto de una cadenaMe gusta la función "Palabra ()" para tales extracciones de cadenas
Names Default To Here( 1 );
dt = New Table( "Test Words",
Add Rows( 9 ),
New Column( "Column 1",
Character,
"Nominal",
Set Values(
{"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303",
"\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600",
"\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303",
"\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600",
"\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600",
"\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078",
"\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073",
"\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)",
"\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)"}
),
Set Display Width( 583 )
)
);
For( i = 1, i <= N Rows( dt ), i++,
Print( Word( 2, dt:column 1[i], "()" ) )
);Re: Extraer texto de una cadenaEn caso de que te gusten las expresiones regulares...(Nota: se limpió el código escrito apresuradamente y se reemplazó la lista a continuación el 12/01/22)
Names Default To Here( 1 );
// make list of example original strings
sample =
"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)";
sample = Words( sample, "\!U000D" );
// Show( sample );
n = N Items( sample );
// iterate over list and return target strings
id = List();
For Each( {string}, sample, Insert Into( id, Regex( string, If( Contains( string, ")" ), "(.+\()(.+)(\).*)", "(.+\()(.+)" ), "\2" ) ) );
Show( id );
Re: Extraer texto de una cadenayo suelo SUBSTR para un efecto similar.
for (i = 1, i <= nrows(dt), i++,
one_value = dt:column 1[i];
start = contains(one_value, "(") + 1;
end = contains(one_value, ")") - 1;
len = end - start + 1;
result = substr(one_value, start, len);
print(result);
);Re: Extraer texto de una cadenaLa solución de @pmroz es muy robusto, agradable!
Un enfoque un poco diferente podría ser usar fórmulas en la tabla de datos

La ubicación del delimitador de inicio podría ubicarse con un argumento "Contiene"
Contains(:text, "(")
La ubicación del delimitador final podría ubicarse de la misma manera
Contains( :text, ")" )
Se podría usar un argumento oscuro pero realmente divertido, "munger", para extraer la cadena entre las ubicaciones del delimitador.
En este caso, queremos que la cadena después del carácter delimitador termine antes del carácter delimitador final, por lo que se suma 1 al principio y se resta al final.
La función para munger en este caso usa los argumentos, texto completo, dónde comenzar, cuántos caracteres regresar. Munger también puede hacer otras cosas interesantes, como buscar y reemplazar.
Munger( :text, :start + 1, (:stop - :start) - 1 )
Envolver todo eso en una fórmula se vería así
Munger(
:text,
Contains( :text, "(" ) + 1,
(Contains( :text, ")" ) - Contains( :text, "(" )) - 1
)
Re: Extraer texto de una cadenaUtilice la función PALABRAS con ( y ) como delimitadores.Utilice el segundo elemento de la lista devuelta.Ejecute el código a continuación y verifique el resultado en la ventana de registro.
dt = New Table( "Test Words", Add Rows( 9 ),
New Column( "Column 1", Character, "Nominal",
Set Values(
{
"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303",
"\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600",
"\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303",
"\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600",
"\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600",
"\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078",
"\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073",
"\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)",
"\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)"}
),
Set Display Width( 583 )
)
);
for (i = 1, i <= nrows(dt), i++,
one_value = dt:column 1[i];
word_list = words(one_value, "()");
print(word_list[2]);
);