Extrayez tous les éléments souhaités d'une chaîne pour permettre une analyse de réponses multiplesSalut! J'ai des données d'un SharePoint que nous utilisons (entre autres) pour suivre quel(s) outil(s)/technique(s) ont été/ont été utilisés pour résoudre un problème. Cela inclut JMP, BTW.Les données (dans une colonne) suivent ce type de formatage délimité ; :
;#;;#;;#...
3.4 Outils d'optimisation et de simulation hors ligne ;#15 ;#3.9 Simulation ;#30;#4.6 Bilan matière ;#22
Chaque ligne du tableau (problème résolu) peut avoir un ou plusieurs . Parfois, la commence par #, parfois non. Mais est toujours précédé de #.
Je voudrais analyser la chaîne pour les et le format pour l'analyse à réponses multiples : 15, 30, 22 (exemple ci-dessus).
- Il y a environ 100 , donc créer environ 100 colonnes clairsemées semble inutile.L’approche utilisée dans le fichier d’exemple de données Failures3Delimited.jmp est-elle la manière la plus efficace d’aborder ce problème ?
- J'ai commencé à apprendre REGEX et j'ai pu trouver une occurrence de , mais pas toutes. Ai-je besoin d'une boucle ? Une autre façon de procéder ?
Merci. Utilisation de JMP17.1 Pro.
Automatisation et scriptsMélange et nettoyage des donnéesRe : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multiplesVoici une solution potentielle que j'ai proposée :

Voici la formule que j'ai utilisée
i = 1;
string = "";
While( Word( i, :Input, "#;" ) != "",
theWord = Word( i, :Input, "#;" );
If( Is Missing( Num( theWord ) ) == 0,
string = string || "," || theWord
);
i++;
);
Try( Substr( string, 2 ) );
Re : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multiplesTrès élégant - au lieu d'une division compliquée première-seconde (deux fois le même délimiteur) ou d'une partie dont la partie est le TEXTE, juste :
trouvez les NUMÉROS 
Espérons qu'il n'y ait pas d'ID #30-2...
ou une description : 42
New Column( "IDs",
Character,
"Multiple Response",
Formula(
Concat Items(
Transform Each( {theWord}, Words( :Input, ";#" ),
Char( Num( theWord ) )
),
""
)
),
Set Property( "Multiple Response", Multiple Response( Separator( "." ) ) ),
)
Re : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multiplesJe ne suggérerai pas d'utiliser Modèle de caractère de JMP car c'est assez difficile à comprendre (au moins toutes les différentes fonctionnalités) mais j'ai réussi (peut-être) à le faire en l'utilisant
Names Default To Here(1);
str = "3.4 Offline Optimization & Simulation Tools;#15;#3.9 Simulation;#30;#4.6 Material Balance;#22";
idlist2 = {};
resval = "";
Pat Match(str, Pat Span("#") + Pat Regex("\d+?") >> next_id + Pat Regex("(;|$)") + Pat Test(
Insert Into(idlist2, next_id); resval = Concat Items(idlist2, ", "))
);
show(idlist2, resval);
voici un exemple de son utilisation dans la formule
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(1),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{
"3.4 Offline Optimization & Simulation Tools;#15;#3.9 Simulation;#30;#4.6 Material Balance;#22"
}
)
),
New Column("Column 2",
Character,
"Multiple Response",
Formula(
idlist2 = {};
resval = "";
Pat Match(
:Column 1,
Pat Span("#") + Pat Immediate(Pat Regex("\d+?"), next_id)
+Pat Regex("(;|$)") + Pat Test(
Insert Into(idlist2, next_id);
resval = Concat Items(idlist2, ", ");
)
);
resval;
),
Set Property("Multiple Response", Multiple Response(Separator(",")))
)
)Re : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multiplesMerci, Jim! Je pensais qu'une sorte de boucle ferait l'affaire, avec ou sans REGEX. J'espère que vous allez bien !
Re : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multiplesJarmo : Merci pour vos efforts ! J'ai lu les sections REGEX et Pat Match dans le manuel de script et j'ai décidé de ne pas essayer Pat Match sauf en cas d'absolue nécessité...
Re : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multipleshogi : Merci pour vos deux soumissions ! J'avais déjà utilisé Words() auparavant, mais je n'y avais pas pensé car dès le début, je me suis convaincu que je devrais rechercher une solution REGEX. Cette solution est très élégante ! J'ai besoin de lire sur Concat Items()...
Jim/Jarmo/hogi : vous avez montré la puissance globale de la communauté ! Je suis maintenant assis à Kuala Lumpur. J'ai posté ceci à la première heure le matin, alors que vous étiez probablement sur le point de dormir/déjà endormi. J'ai eu une solution de votre part en fin d'après-midi. Merci encore!
Re : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multiples@hogi a écrit:
... partage compliqué de la première seconde ...
en fait - moins compliqué que je ne le pensais 
New Column( "IDs",
Character,
"Multiple Response",
Formula(
splitItems = Words( :Input, ";#" );
Concat Items( splitItems[2:: N Items( splitItems ):: 2], "," );
)
)
... et l'une des prochaines versions de Jmp rendra la tâche encore plus simple :
https://community.jmp.com/t5/JMP-Wish-List/new-slicing-options-for-matrices/idc-p/614326/highlight/true#M4057
Re : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multiplesLe changement nécessaire est le délimiteur actuel d'une seule que JMP reconnaît comme réponses multiples. La fonction Substitut fonctionnerait également bien dans ce cas.
Re : Extraire tous les éléments souhaités d'une chaîne pour permettre l'analyse de réponses multiples?