Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?J'ai un paragraphe de texte contenant plusieurs nombres dans différentes phrases et je voudrais extraire ces nombres et les empiler dans une colonne d'un nouveau tableau.
La phrase ressemble à ceci :
Les sacs sont pesés sur une balance mobile au lieu de stockage. Chaque sac de 5 est échantillonné. L'échantillon primaire de A : 10 kg, B : 20 kg, C : 30 kg,
40 kg et E : 50 kg ont été séchés pendant 24 heures à 105 °C. L'échantillon a été soumis à des fractionnements répétés, laissant environ 800 à 1 000 grammes qui ont été broyés davantage pour passer un tamis de test de 100 mesh. L'échantillon broyé est mélangé dans un mélangeur en V pendant 20 minutes et transféré dans une bouteille en plastique étanche de 100 ml et scellée.
De plus, le nombre d’échantillons primaires différents peut varier de 1 à 20 ou 30.
Je serais très reconnaissant si quelqu'un pouvait m'indiquer la bonne direction avec un script. J'ai essayé de l'écrire avec l'aide de Copilot, mais je n'ai pas obtenu le résultat souhaité.
Merci beaucoup !
Automatisation et scriptsRe : Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Voici une façon de procéder :
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 );
Je suis sûr qu'il y a quelqu'un qui fournira également une solution RegEx().
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Vous pouvez utiliser Words pour cela, mais vous devez disposer d'une liste de caractères non numériques. Vous pouvez ensuite utiliser Concat Items() pour transformer la liste obtenue en chaîne
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 une correspondance plus complexe est requise, Regex() ou Pat Match() sont des options, mais à mon avis, cela ne vaut pas vraiment la peine d'apprendre Pat Match() avec sa documentation actuelle et les exemples trouvés dans la documentation. Ajouter un indicateur à Regex Match() pour trouver toutes les occurrences non superposées du motif rendrait des tâches comme celle-ci beaucoup plus faciles à réaliser.
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?J'ai essayé de développer votre suggestion, mais je n'ai pas réussi à la faire fonctionner. Malheureusement, mes conclusions me laissent perplexe, j'espérais donc qu'il était possible d'obtenir d'autres informations, s'il vous plaît.
L'extrait ci-dessous contient "10 kg". Jusqu'ici tout va 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 );
Essayons d'écrire ceci dans une boucle pour trouver tous les poids associés à « kg » dans la chaîne. Je peux trouver tous les mots individuels et les combiner en paires. Au sein de ces paires, je pensais qu'il serait facile de trouver des paires comme « 10 kg », « 20 kg », « 30 kg » et ainsi de suite, mais le code refuse obstinément de trouver des correspondances et de les placer dans la liste matches={}.
J'ai essayé de déplacer le regexPattern à l'intérieur de la fonction If, et j'ai essayé d'encapsuler « combiné » ainsi que la variable « regexPattern » dans 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'est-ce que je néglige ?
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Je n'ai pas tout passé en revue, mais après un rapide coup d'œil au script, « . » est un caractère générique, vous devez donc l'échapper.
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Merci, mais c'est ce que je voulais démontrer avec le premier extrait : il identifie correctement la première correspondance avec « un nombre + kg » (c'est-à-dire « 10 kg ») dans l'exemple. Si cela fonctionne une fois, ne devrait-il pas fonctionner pour toutes les paires de jetons/mots ?
Re : Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Oh oui, désolé. Je devrais me réveiller et prendre mon café avant de poster ici. J'ai déjà rencontré ce genre de problème et j'ai mis une réponse (alors que j'étais à mon dernier emploi) ici .
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Haha, il n'y a pas de quoi s'inquiéter ! C'est toujours bien d'avoir des commentaires amicaux:)
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Bon argument pour soutenir l'objet de la liste de souhaits de Hogi.
Option d'ajout d'expression régulière pour tous les indicateurs
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Merci pour toutes vos contributions jusqu'à présent - je le teste maintenant
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Je ne sais pas si ce que vous essayez de faire est d'exercer RegEx, ou si vous essayez réellement de trouver une solution pour trouver toutes les références aux valeurs kg. Si c'est le dernier cas, le JSL ci-dessous est une solution très efficace
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")
)
)
);Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?En fait, les deux. Merci pour votre aide et votre patience. Je n'ai jamais utilisé "loc()", donc c'est un bon apprentissage.
Copier-coller l'intégralité de votre bloc de code et ajouter « Print( matches) » donne {« 40 kg », « 50 kg »}. Cela est cohérent avec « potential = Loc( words, "kg" ); » ne trouvant que « [32, 36] ». Intéressant.
- Pourquoi votre solution ne trouve-t-elle pas « 10 kg », « 20 kg » et « 30 kg » ?
- Pourquoi ma solution ne trouve rien ?
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Ce sont les virgules. « kg » déroute.
Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?La fonction Words() utilise uniquement des espaces comme délimiteurs, par conséquent, les mots kg avec des virgules (kg, ) ou des points (kg. ) laissent ces caractères dans le mot extrait. Cela peut être facilement modifié en ajoutant la virgule et le point comme délimiteurs à vérifier avec l'espace
Changement
words = Words( text );
à
words = Words( text," ,." );
Re : Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?Vous pouvez utiliser une boucle while pour quelque chose comme ceci (cela modifiera la chaîne d'origine, vous souhaiterez donc peut-être en utiliser une copie)
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);
Ou Pat Match si vous pouvez comprendre comment cela fonctionne (je n'ai jamais vraiment réussi à le faire correctement)
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);Ré: Comment identifier les nombres dans un paragraphe et les extraire sous forme de colonne dans un nouveau tableau ?@CalibrationBear , as-tu trouvé une solution et vas-tu la partager ? Merci:)