Contar los pasajes numéricos en una cadenaProbablemente sea una pregunta muy específica, pero tengo una cadena contenida en una celda JMP y necesito poder aislar un pasaje específico de caracteres numéricos en la cadena. La cadena contiene caracteres y números y la secuencia puede ser variable. Por ejemplo, si tengo la entrada de celda
aaa1b222c3
y quiero centrarme en el pasaje 222, consideré un medio para contar el número de pasajes numéricos como 3 y luego aislar el segundo de ellos.
Se me ocurrió una forma de hacer esto con expresiones regulares, pero es demasiado complicada como para que valga la pena publicarla. Estoy seguro de que hay una forma más adaptable de lograrlo. Se agradecen todas las ideas.
Adiós
Cabeza de llave inglesa
Automatización y scriptingRe: Contar los pasajes numéricos en una cadena¿Podrías proporcionar más ejemplos de las posibles cadenas y las partes que deseas aislar? ¿Qué quieres hacer con esas partes? ¿Extraerlas? ¿Eliminarlas? ¿Verificar si existen?
Re: Contar los pasajes numéricos en una cadenajarmo
Mi objetivo general es crear una nueva columna que contenga el valor numérico como entrada de celda. Esto se deriva del hecho de que la entrada original contiene información dimensional y me gustaría que esté disponible automáticamente en formato numérico. Uno de los pasajes numéricos es una longitud, el otro es un ancho. Hay otros números incluidos y necesito un medio para omitirlos. La cadena real se verá más parecida a
Val1b200X300
que es un dispositivo de 200 de largo por 300 de ancho y necesito columnas nuevas que contengan celdas generadas que reflejen esos valores. Los caracteres numéricos adicionales no son consistentes en longitud o ubicación, lo que agrega complejidad a la tarea.
Adiós
Cabeza de llave inglesa
Re: Contar los pasajes numéricos en una cadena¿Siempre son tres caracteres? ¿Siempre son los dos últimos números? ¿Siempre están separados por una "X"?
Re: Contar los pasajes numéricos en una cadenajarmo
Violación parcial de la ley de Murphy. No siempre la misma longitud, no siempre los dos últimos números, pero siempre separados por una X.
Adiós
Cabeza de llave inglesa
Re: Contar los pasajes numéricos en una cadenaEsto podría ser suficiente o quizás tengas que agregar algunas condiciones adicionales (verifica que esté al principio/final o que haya una letra antes/después).
Names Default To Here(1);
str = "Val1b200X300abcc1";
r = Regex Match(str, "(\d+)X(\d+)");
Show(Num(r[2]), Num(r[3]));
Re: Contar los pasajes numéricos en una cadenajarmo
¡Excelente! Esto es lo que se me ocurrió al final. La etiqueta es la columna que contiene la cadena en la que intento realizar la cirugía.
New Column("Width", Character, "Nominal", Formula(Regex(:Label, "(\d+)X", "\1")), Set Selected);
New Column("Length", Character, "Nominal", Formula(Regex(:Label, "X(\d+)", "\1")), Set Selected);
Parece que funciona.
Adiós
Cabeza de llave inglesa
Re: Contar los pasajes numéricos en una cadenaEsto depende de sus datos, pero es posible que desee agregar una pequeña adición a sus patrones de expresiones regulares: agregue la verificación de otro número en el otro lado de X para evitar problemas en los que solo tendría algo como "1Xa".
Names Default To Here(1);
strs = {"A1X2", "A1Xa", "1X2", "a1X23", "aX2", "A1X2a"};
For Each({str}, strs,
a1 = Regex(str, "(\d+)X", "\1");
a2 = Regex(str, "X(\d+)", "\1");
// vs
b1 = Regex(str, "(\d+)X(\d+)", "\1");
b2 = Regex(str, "(\d+)X(\d+)", "\2");
Write("\!NCurrent string: ", str);
Write("\!NFirst pattern matches: ", a1, " ", a2);
Write("\!NSecond pattern matches: ", b1, " ", b2);
Write("\!N");
);
Current string: A1X2
First pattern matches: 1 2
Second pattern matches: 1 2
Current string: A1Xa
First pattern matches: 1 .
Second pattern matches: . .
Current string: 1X2
First pattern matches: 1 2
Second pattern matches: 1 2
Current string: a1X23
First pattern matches: 1 23
Second pattern matches: 1 23
Current string: aX2
First pattern matches: . 2
Second pattern matches: . .
Current string: A1X2a
First pattern matches: 1 2
Second pattern matches: 1 2
Re: Contar los pasajes numéricos en una cadenaAdemás, mi primera comprensión del problema inicial fue extraer la secuencia más larga de números de una cadena, así que aquí hay algunos scripts para eso (podrían ser útiles para alguien).
1. Uso de Words() (se podría utilizar una idea similar para extraer cadenas no numéricas)
Names Default To Here(1);
str = "aaa1b222c3";
alphabets = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
nums = Words(str, alphabets);
lengths = Transform Each({num}, nums, Output("Matrix"), Length(num));
l_idx = Loc Max(lengths);
longest_num_seq = nums[l_idx];
show(nums, longest_num_seq); //nums = {"1", "222", "3"}, longest_num_seq = "222";
2. Uso de While + Regex
Names Default To Here(1);
str = "aaa1b222c3";
nums = {};
strcopy = str;
While(!IsMissing(match = Regex(strcopy, "\d+")),
idx = Contains(strcopy, match);
Insert Into(nums, match);
Remove From(strcopy, idx, Length(match));
);
l_idx = Loc Max(lengths);
longest_num_seq = nums[l_idx];
show(nums, longest_num_seq); //nums = {"1", "222", "3"}, longest_num_seq = "222";