Extraire le texte d'une chaîneSalut,
Si possible, j'aimerais extraire un texte particulier des chaînes :
\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG bonjour TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG bonjour ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG bonjour 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 bonjour TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG bonjour YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG bonjour YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG bonjour TT-YYT (CTL1008.1)
et je veux extraire les identifiants ci-dessus :
CTL1083.1
CIL0858.1
CTL1077.1
CMA0851.1
CMS0499.1
CTL1078
CTLR1073
CTLR0999.1
CTL1008.1
Toute aide appréciée.
Merci,
Tomasz
Ingénierie Qualité et ProcédésRe : Extraire le texte d'une chaîneChut !@Craige_Hales , s'il te plaît, ne le dis pas @Byron_JMP . Vous allez vraiment le blesser. (Peau fine, j'en ai peur)
Re : Extraire le texte d'une chaîneCorrespondance de motifs, dites-vous ? Que dis-tu de ça
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));
Il est dommage qu'il n'y ait pas plus de documentation d'assistance pour apprendre à utiliser la correspondance de modèles. J'étais un "Pourquoi s'embêter avec la correspondance de modèles quand vous avez Regex?" personne jusqu'à ce que je commence à mieux la comprendre et l'apprécier (merci @Craige_Hales !). Il est incroyablement rapide et compact. Pour expliquer le code ci-dessus, Pat Match recherche une parenthèse ouverte suivie d'un ou plusieurs caractères de jeu de caractères suivi de la parenthèse fermante ou d'un retour chariot. Les résultats de Pat Span sont stockés dans la variable ID suivant . Chaque fois que le modèle est trouvé, Test de Pat est utilisé pour l'insérer dans liste d'identifiants . Le 0 au bout du Test de Pat vous permet de continuer à rechercher la chaîne d'entrée à partir de la position immédiatement après le dernier caractère de la chaîne correspondante (mais avant le caractère suivant). Si la dernière déclaration de Test de Pat avait évalué à vrai (tout ce qui n'est pas 0), la recherche se serait terminée, renvoyant uniquement la première correspondance.
Re : Extraire le texte d'une chaîneJ'aime la simplicité de word() ouwords() quand ça marche. J'ai écrit sur Munger ici et je ne comprends plus comment l'utiliser. Je pense que c'est dans JMP parce qu'il était disponible sur Mac en 1990... pas parce que c'était un exemple d'une bonne façon de manipuler des chaînes.
Re : Extraire le texte d'une chaînetrès sympa, toutes les suggestions opèrent par magie.
J'ai utilisé le Munger dans mon script et fonctionne parfaitement.
Merci beaucoup
Tomasz
Re : Extraire le texte d'une chaîneWow, il existe de nombreuses façons de trancher une miche de pain dans JMP.
Re : Extraire le texte d'une chaîne@pmroz , ton code a toujours l'air beaucoup moins aléatoire que le mien ; )
Substring (substr) est une approche plus simple, je ne peux tout simplement pas résister à un bon argument en faveur de Munger.
Craig Hales propose probablement des approches encore plus efficaces utilisant la correspondance de modèles. Je suis sûr qu'il y a déjà quelques exemples dans les pages de la communauté ou sur sa page de blog.
Re : Extraire le texte d'une chaîneJ'aime la fonction "Word()" pour de telles extractions de chaînes
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 : Extraire le texte d'une chaîneSi vous aimez les expressions régulières...(Remarque : nettoyage du code écrit à la hâte et remplacement de la liste ci-dessous le 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 : Extraire le texte d'une chaînej'utilise SUBSTR pour un effet similaire.
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 : Extraire le texte d'une chaîneLa solution de @pmroz est très robuste, sympa !
Une approche légèrement différente pourrait consister à utiliser des formules dans le tableau de données

L'emplacement du délimiteur de début peut être localisé avec un argument "Contient"
Contains(:text, "(")
L'emplacement du délimiteur de fin pourrait être localisé de la même manière
Contains( :text, ")" )
Un argument obscur mais vraiment amusant, "munger", pourrait être utilisé pour extraire la chaîne entre les emplacements des délimiteurs.
Dans ce cas, nous voulons la chaîne après le caractère délimiteur, qui se termine avant le caractère délimiteur de fin, donc 1 est ajouté au début et soustrait de la fin.
La fonction pour munger dans ce cas utilise les arguments, le texte entier, par où commencer, combien de caractères renvoyer. Munger peut également faire d'autres choses intéressantes, comme rechercher et remplacer.
Munger( :text, :start + 1, (:stop - :start) - 1 )
Réunir tout cela dans une seule formule ressemblerait à ceci
Munger(
:text,
Contains( :text, "(" ) + 1,
(Contains( :text, ")" ) - Contains( :text, "(" )) - 1
)
Re : Extraire le texte d'une chaîneUtilisez la fonction MOTS avec ( et ) comme délimiteurs.Utilisez le deuxième élément de la liste renvoyée.Exécutez le code ci-dessous et vérifiez le résultat dans la fenêtre de journal.
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]);
);