¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Tengo un párrafo de texto que contiene varios números en diferentes oraciones y me gustaría extraer esos números y apilarlos en una columna en una nueva tabla.
La frase se ve así:
Las bolsas se pesan en una báscula móvil en el lugar de almacenamiento. Cada bolsa de 5 kg se muestrea con arpón. La muestra primaria de A: 10 kg, B: 20 kg, C: 30 kg,
40 kg y E: 50 kg se secaron durante 24 horas a 105 C. La muestra se sometió a divisiones repetidas, lo que dejó unos 800-1000 gramos que se molieron nuevamente para pasar por un tamiz de prueba de malla 100. La muestra triturada se mezcla en una licuadora en V durante 20 minutos y se transfiere a una botella de plástico impermeable de 100 ml y se sella.
Además, el número de muestras primarias diferentes puede variar desde 1 hasta 20 o 30.
Agradecería mucho que alguien me orientara con un guión. Intenté escribirlo con la ayuda de Copilot, pero no obtuve el resultado que quería.
¡Muchas gracias!
Automatización y scriptingRe: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?He aquí una forma de hacerlo:
names default to here(1);
paragraph="The bags are weighed on a mobile scale at storage location. Each 5. bag is spear sampled.
The primary sample of A: 10 kg, B: 20 kg, C: 30 kg, 40 kg and E: 50 kg was dried for 24 hours at 105 C.
The sample was subject to repeated splitting, leaving some 800-1000 grams which was further milled to
pass a 100-mesh test sieve. The crushed sample is blended in a V-blender for 20 minutes and transferred
to 100 ml waterproof plastic bottle and sealed.";
theNumbers = {};
i = 1;
While( Word( i, paragraph, " ." ) != "",
theWord = Word( i, paragraph, " ." );
If( Is Missing( Num( theWord ) ) == 0,
Insert Into( theNumbers, Num( theWord ) )
);
i++;
);<BR />Show( theNumbers );
Estoy seguro de que habrá alguien que también proporcionará una solución RegEx().
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Puedes usar palabras para esto, pero debes tener una lista de caracteres no numéricos. Luego puedes usar Concat Items() para convertir la lista que obtengas en una cadena.
Names Default To Here(1);
str = "The bags are weighed on a mobile scale at storage location. Each 5. bag is spear sampled. The primary sample of A: 10 kg, B: 20 kg, C: 30 kg, 40 kg and E: 50 kg was dried for 24 hours at 105 C. The sample was subject to repeated splitting, leaving some 800-1000 grams which was further milled to pass a 100-mesh test sieve. The crushed sample is blended in a V-blender for 20 minutes and transferred to 100 ml waterproof plastic bottle and sealed.";
matchchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" || Get Punctuation Characters() || Get Whitespace Characters();
nums = Words(str, matchchar);
// {"5", "10", "20", "30", "40", "50", "24", "105", "800", "1000", "100", "20", "100"}
Concat Items(nums, ", "); // "5, 10, 20, 30, 40, 50, 24, 105, 800, 1000, 100, 20, 100"
Si se requiere una coincidencia más complicada, Regex() o Pat Match() son opciones, pero en mi opinión no vale la pena aprender Pat Match() con su documentación actual y los ejemplos que se encuentran en la documentación. Agregar una bandera a Regex Match() para encontrar todas las ocurrencias de patrones que no se superponen haría que tareas como esta sean mucho más fáciles de completar.
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Intenté ampliar tu sugerencia, pero no pude lograr que funcionara. Lamentablemente, mis hallazgos me confunden, por lo que esperaba que fuera posible obtener más comentarios, por favor.
El fragmento que aparece a continuación indicará "10 kg". Hasta aquí todo bien.
Names Default To Here( 1 );
text = "The bags are weighed on a mobile scale at storage location. Each 5. bag is spear sampled. <BR />The primary sample of A: 10 kg, B: 20 kg, C: 30 kg, 40 kg and E: 50 kg was dried for 24 hours at 105 C. <BR />The sample was subject to repeated splitting, leaving some 800-1000 grams which was further milled to <BR />pass a 100-mesh test sieve. The crushed sample is blended in a V-blender for 20 minutes and transferred <BR />to 100 ml waterproof plastic bottle and sealed.";<BR />
// Use a regular expression to find all the numbers, including decimals
matches = Regex( text, "\d+([.,]\d+)?\s*kg" );
Show( matches );
Intentemos escribir esto en un bucle para encontrar todos los pesos asociados con "kg" en la cadena. Puedo encontrar todas las palabras individuales y puedo combinarlas en pares. Dentro de estos pares, pensé que debería ser sencillo encontrar pares como "10 kg", "20 kg", "30 kg", etc., pero el código se niega obstinadamente a encontrar coincidencias y las coloca en la lista matches={}.
Intenté mover regexPattern dentro de la función If, e intenté envolver "combined" así como la variable "regexPattern" en Eval().
Names Default To Here( 1 );<BR />// the text
text = "The bags are weighed on a mobile scale at storage location. Each 5. bag is spear sampled. <BR />The primary sample of A: 10 kg, B: 20 kg, C: 30 kg, 40 kg and E: 50 kg was dried for 24 hours at 105 C. <BR />The sample was subject to repeated splitting, leaving some 800-1000 grams which was further milled to <BR />pass a 100-mesh test sieve. The crushed sample is blended in a V-blender for 20 minutes and transferred <BR />to 100 ml waterproof plastic bottle and sealed.";<BR />
// break text into words and print each of them. works as expected
words = Words( text );
For( i = 1, i <= N Items( words ), i++,
Print( words[i] )
);
// regex pattern variable
regexPattern = "\d+([.,]\d+)?\s*kg";
// empty list to store matches
matches = {};
// loop over all words in text to create and print pairs of words (we're looking for "10 kg", "20 kg" and so on). works fine
For( i = 1, i <= N Items( words ) - 1, i++,
combined = words[i] || " " || words[i + 1];
Print( "Checking: " || combined );
);
<BR /><BR /><BR />// THIS PART DOESN'T WORK
// loop once more over all words from text to create pairs of words and look for the regexPattern
For( i = 1, i <= N Items( words ) - 1, i++,
combined = words[i] || " " || words[i + 1];
// check if the current combined string matches the pattern (e.g., "10 kg")
If( Regex Match( combined, regexPattern ),
Insert Into( matches, combined );
Print( "Match found: " || combined );
,
// else
Print( "No match for: " || combined );
);
);¿Qué estoy pasando por alto?
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?No lo he repasado todo, pero con solo echar un vistazo rápido al guión, "." es un comodín, por lo que deberás escaparlo.
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Gracias, pero eso es lo que quería demostrar con el primer fragmento: identifica correctamente la primera coincidencia con "un número + kg" (es decir, "10 kg") en el ejemplo. Si funciona una vez, ¿no debería funcionar para todos los pares de tokens/palabras?
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Ah, sí, lo siento. Debería despertarme y tomarme un café antes de publicar aquí. Ya me encontré con algo así antes y publiqué una respuesta (mientras estaba en mi último trabajo) aquí .
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Jaja, ¡no hay de qué preocuparse! Siempre es bueno recibir comentarios de amigos.:)
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Buen caso para apoyar el artículo de la lista de deseos de Hogi.
Opción de agregar expresiones regulares para todas las banderas
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Gracias por todos los aportes hasta ahora. Lo estoy probando ahora.
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?No sé si lo que intentas hacer es ejercitar RegEx o si en realidad intentas encontrar una solución para encontrar todas las referencias a valores kg. Si este último es el caso, el JSL que se muestra a continuación es una solución muy eficiente.
Names Default To Here( 1 );// the text
text = "The bags are weighed on a mobile scale at storage location. Each 5. bag is spear sampled. The primary sample of A: 10 kg, B: 20 kg, C: 30 kg, 40 kg and E: 50 kg was dried for 24 hours at 105 C. The sample was subject to repeated splitting, leaving some 800-1000 grams which was further milled to pass a 100-mesh test sieve. The crushed sample is blended in a V-blender for 20 minutes and transferred to 100 ml waterproof plastic bottle and sealed.";
// break text into words and print each of them. works as expected
words = Words( text );
// regex pattern variable
regexPattern = "\d+([.,]\d+)?\s*kg";
// empty list to store matches
matches = {};
potential = loc(words,"kg");
If( length(potential) > 0,
for each( {kg}, potential,
if( isMissing(words[kg-1])==0,
insert into(matches, words[kg -1] || " kg")
)
)
);Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?En realidad, ambas cosas. Gracias por tu ayuda y paciencia. Nunca he usado "loc()", así que es un buen aprendizaje.
Copiar y pegar el bloque de código completo y agregar "Print( matches)" da como resultado {"40 kg", "50 kg"}. Esto es coherente con "potential = Loc( words, "kg" );" que solo encuentra "[32, 36]". Interesante.
- ¿Por qué su solución no encuentra "10 kg", "20 kg" y "30 kg"?
- ¿Por qué mi solución no encuentra nada?
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Son las comas. "kg", lo que lo desorienta.
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?La función Words() solo utiliza espacios como delimitadores, por lo tanto, las palabras kg con comas (kg,) o puntos (kg.) dejan esos caracteres en la palabra extraída. Esto se puede cambiar fácilmente agregando la coma y el punto como delimitadores para verificar junto con el espacio.
Cambiar
words = Words( text );
a
words = Words( text," ,." );
Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?Puedes usar un bucle while para algo como esto (esto modificará la cadena original, por lo que es posible que quieras usar una copia de ella)
Names Default To Here(1);
text = "The bags are weighed on a mobile scale at storage location. Each 5. bag is spear sampled. The primary sample of A: 10 kg, B: 20 kg, C: 30 kg, 40 kg and E: 50 kg was dried for 24 hours at 105 C. The sample was subject to repeated splitting, leaving some 800-1000 grams which was further milled to pass a 100-mesh test sieve. The crushed sample is blended in a V-blender for 20 minutes and transferred to 100 ml waterproof plastic bottle and sealed.";
res = {};
While(!Is Missing(match = Regex(text, "\d+.kg")),
Insert Into(res, match);
text = Substr(text, Contains(text, match) + Length(match));
);
show(res);
O Pat Match si puedes entender cómo funciona (nunca he podido hacerlo correctamente)
Names Default To Here(1);
text = "The bags are weighed on a mobile scale at storage location. Each 5. bag is spear sampled. The primary sample of A: 10 kg, B: 20 kg, C: 30 kg, 40 kg and E: 50 kg was dried for 24 hours at 105 C. The sample was subject to repeated splitting, leaving some 800-1000 grams which was further milled to pass a 100-mesh test sieve. The crushed sample is blended in a V-blender for 20 minutes and transferred to 100 ml waterproof plastic bottle and sealed.";
found_list = {};
Pat Match(
text,
Pat Any("., ") + Pat Regex("(\d+.kg)") >> match + Pat Any("., ") + Pat Test(
Insert Into(found_list, match);
0;
)
);
Show(found_list);Re: ¿Cómo identifico números en un párrafo y los extraigo como columna en una nueva tabla?@CalibrationBear , ¿encontraste una solución y la compartirías? Gracias:)