Compter les passages numériques dans une chaîneIl s'agit probablement d'un cas très spécifique, mais j'ai une chaîne contenue dans une cellule JMP et je dois pouvoir isoler un passage spécifique de caractères numériques dans la chaîne. La chaîne contient à la fois des caractères et des chiffres et la séquence peut être variable. Par exemple, si j'ai l'entrée de cellule
aaa1b222c3
et je veux me concentrer sur le passage 222, j'ai envisagé un moyen de compter le nombre de passages numériques comme étant 3, puis d'isoler le deuxième d'entre eux.
J'ai trouvé un moyen de faire cela avec Regex, mais c'est trop compliqué pour mériter d'être publié. Je suis sûr qu'il existe un moyen plus adaptatif d'y parvenir. Toutes les idées sont appréciées.
Au revoir
Tête de clé
Automatisation et scriptsRe: Compter les passages numériques dans une chaînePourriez-vous fournir plus d'exemples de chaînes possibles et des parties que vous souhaitez isoler ? Et que souhaitez-vous faire de ces parties ? Les extraire ? Les supprimer ? Vérifier si elles existent ?
Re: Compter les passages numériques dans une chaîneJarmo
Mon objectif général est de créer une nouvelle colonne contenant la valeur numérique comme entrée de cellule. Cela découle du fait que l'entrée d'origine contient des informations dimensionnelles et que je souhaite qu'elles soient automatiquement disponibles sous forme numérique. L'un des passages numériques est une longueur, l'autre est une largeur. Il y a d'autres nombres inclus et j'ai besoin d'un moyen de les contourner. La chaîne réelle ressemblera plus à
Val1b200X300
qui est un appareil de 200 de long sur 300 de large et j'ai besoin de nouvelles colonnes contenant des cellules générées reflétant ces valeurs. Les caractères numériques supplémentaires ne sont pas cohérents en longueur ou en placement, ce qui ajoute de la complexité à la tâche.
Au revoir
Tête de clé
Re: Compter les passages numériques dans une chaîneSont-ils toujours composés de trois caractères ? Sont-ils toujours les deux derniers chiffres ? Sont-ils toujours séparés par un « X » ?
Re: Compter les passages numériques dans une chaîneJarmo
Violation partielle de la loi de Murphy. Pas toujours la même longueur, pas toujours les 2 derniers chiffres mais toujours séparés par un X.
Au revoir
Tête de clé
Re: Compter les passages numériques dans une chaîneCela peut être suffisant ou vous devrez peut-être ajouter quelques conditions supplémentaires (vérifier qu'il est au début/à la fin ou qu'il y a une lettre avant/après)
Names Default To Here(1);
str = "Val1b200X300abcc1";
r = Regex Match(str, "(\d+)X(\d+)");
Show(Num(r[2]), Num(r[3]));
Re: Compter les passages numériques dans une chaîneJarmo
Super boulot ! Voici ce que j'ai trouvé au final. L'étiquette est la colonne contenant la chaîne sur laquelle j'essaie d'effectuer une intervention chirurgicale.
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);
Cela semble fonctionner.
Au revoir
Tête de clé
Re: Compter les passages numériques dans une chaîneCela dépend de vos données, mais vous souhaiterez peut-être ajouter un petit ajout à vos modèles d'expressions régulières : ajoutez la vérification d'un autre numéro de l'autre côté de X pour éviter les problèmes où vous auriez simplement quelque chose comme « 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: Compter les passages numériques dans une chaîneMa première compréhension du problème initial était également d'extraire la plus longue séquence de nombres d'une chaîne, voici donc quelques scripts pour cela (cela pourrait être utile à quelqu'un).
1. Utilisation de Words() (une idée similaire pourrait être utilisée pour extraire des chaînes non numériques)
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. Utilisation 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";