Analyser la chaîne d'une colonne et remplir une autre colonneSalut,
J'ai une table contenant ProductName et je veux générer la colonne OUTPUT.La colonne OUTPUT est une concaténation de ProductID avec Serial#. Comment analyser avec précision le numéro de série et créer la colonne OUTPUT ?
Exemples de numéro de série :
- 07-08_13 signifie n° de série 07, 08, 13
- 09-12 signifie n° de série 09, 10, 11, 12
- 01-03_05-08 signifie n° de série 01, 02, 03, 05, 06, 07, 08
- 01_04_05-08 signifie n° de série 01, 04, 05, 06, 07, 08
- 09_11_13_14 signifie n° de série 09,11,13,14

| Nom du produit | SORTIR |
| AABBCC_07-08_13 | AABBCC-07 |
| AABBCC_07-08_13 | AABBCC-08 |
| AABBCC_07-08_13 | AABBCC-13 |
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
| EEFFGG_02 | EEFFGG-02 |
| HHIIJJ_01-07 | HHIIJJ-01 |
| HHIIJJ_01-07 | HHIIJJ-02 |
| HHIIJJ_01-07 | HHIIJJ-03 |
| HHIIJJ_01-07 | HHIIJJ-04 |
| HHIIJJ_01-07 | HHIIJJ-05 |
| HHIIJJ_01-07 | HHIIJJ-06 |
| HHIIJJ_01-07 | HHIIJJ-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-01 |
| KKLLLMM_01-03_05-08 | KKLLLMM-02 |
| KKLLLMM_01-03_05-08 | KKLLLMM-03 |
| KKLLLMM_01-03_05-08 | KKLLLMM-05 |
| KKLLLMM_01-03_05-08 | KKLLLMM-06 |
| KKLLLMM_01-03_05-08 | KKLLLMM-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-08 |
| NNOOPP_01_04_05-08 | NNOOPP-01 |
| NNOOPP_01_04_05-08 | NNOOPP-04 |
| NNOOPP_01_04_05-08 | NNOOPP-05 |
| NNOOPP_01_04_05-08 | NNOOPP-06 |
| NNOOPP_01_04_05-08 | NNOOPP-07 |
| NNOOPP_01_04_05-08 | NNOOPP-08 |
| QQRRSS_09_11_13_14 | QQRRSS_09 |
| QQRRSS_09_11_13_14 | QQRRSS_11 |
| QQRRSS_09_11_13_14 | QQRRSS_13 |
| QQRRSS_09_11_13_14 | QQRRSS_14 |
Tableau de donnéesScriptRe : Analyser la chaîne d'une colonne et remplir une autre colonneVous pouvez très probablement écrire une formule avec Lag pour le faire (ou un script avec JSL), mais vous pouvez également essayer de le faire de manière interactive, mais cela prend quelques étapes :
1. Sélectionnez la colonne ProductName
2. Allez dans les colonnes Cols/Utilities/Text To et utilisez à la fois - et _ comme délimiteurs

3. Allez dans Tables et Pile et ajoutez tout le reste en dehors de la première colonne à la sélection des Colonnes de pile


5. Supprimer la colonne Étiquette
6. Sélectionnez les deux colonnes qui restent et allez dans Lignes / Sélection de ligne / Sélectionnez Dupliquer les lignes et supprimez ces lignes

7. Sélectionnez une cellule avec une valeur vide et choisissez Sélectionner les cellules correspondantes et supprimez ces lignes
8. Maintenant, choisissez les deux colonnes et faites un clic droit sur l'en-tête de colonne et créez une formule

9. Ouvrez la formule que vous venez de créer et remplacez le , par _

10. Renommer et supprimer des colonnes/formules
11. Si vous avez besoin d'avoir ProductName là, vous devriez pouvoir le garder là si vous ne le supprimez pas accidentellement dans la première étape comme je l'ai fait

Si vous devez avoir - ou _ en fonction du numéro de série, vous pouvez le gérer dans la formule de concaténation très probablement
Edit : j'ai vérifié la question un peu plus précisément et c'est un peu plus compliqué que ce que j'ai montré ici. Vous devrez ajouter des calculs pour certains des numéros de série car ils sont entre les numéros. Cette solution ne fonctionnera pas dans ceux-ci car certaines lignes seront supprimées lorsque les doublons seront supprimés.
Re : Analyser la chaîne d'une colonne et remplir une autre colonnesalut @cchueng ,
Il y a plusieurs façons. Certains sont des scripts de base (recherchez une réponse de quelqu'un qui suggère cela avec un exemple) ou vous pouvez utiliser des tours successifs de Text to Columns (exemple trouvé ici Résolu : Comment puis-je diviser le texte d'une colonne en plusieurs colonnes ? - Communauté d'utilisateurs JMP) Ensuite, vous pouvez concaténer les colonnes souhaitées en les sélectionnant, puis utiliser une formule de colonne ou utiliser l'option Nouvelle colonne de formule après un clic droit sur l'une des colonnes sélectionnées. Recherchez les options de caractère pour concat.La formule de colonne est plus flexible et vous donne beaucoup d'options voir l'aide sur ce sujet ( Créer des formules dans JMP )
J'espère que cela vous donne une direction.
Meilleur,
Re : Analyser la chaîne d'une colonne et remplir une autre colonne@jthi ,
Tu m'as devancé.
Ton explication est plus détaillée et ce à quoi je pensais aussi.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneAh, tu as raison. le - est interprété comme une plage et le _ est interprété comme un véritable délimiteur d'éléments
Re : Analyser la chaîne d'une colonne et remplir une autre colonneMerci mais je préfère un jsl plutôt que le délimiteur interactif. Votre méthode n'a pas abordé le scénario lorsque le numéro de série 09-12. Il devrait afficher des lignes comme ci-dessous. Pas seulement AABBCC-09 et AABBCC-12. Le « - » signifie « à » qui signifie plage. Donc 09-12 signifie 09, 10, 11, 12.
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
Re : Analyser la chaîne d'une colonne et remplir une autre colonneD'accord, cela pourrait fonctionner. Nécessite JMP16 en raison de l'utilisation de For Each (peut être remplacé par For pour d'autres versions. Il s'agit d'une solution fortement scriptée, avec peu ou pas de commentaires et nécessitera une table de départ spécifique pour fonctionner (nécessite la colonne OUTPUT).
Names Default To Here(1);
dt = New Table("Untitled 4993",
Add Rows(32),
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
),
New Column("OUTPUT",
Character(16),
"Nominal",
Set Values({"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""})
)
);
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd,
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges,
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
dt[0,"OUTPUT"] = valList;Vous vous demandez si quelque chose comme cela pourrait être fait "facilement" avec la propre correspondance de motifs de JMP @Craige_Hales
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut chris,
J'ai un script qui traitera une partie du ProductName et parfois analysera mal. Pouvez-vous revoir et ajouter des codes pour traiter les ProductNames qui ne fonctionnent pas jusqu'à présent ?
Fonctionnera pour les exemples ci-dessous :
EEFFGG_02
HHIIJJ_01-07
KKLLLMM_01-03_05-08
Ne fonctionnera pas encore pour les exemples ci-dessous :
AABBCC_07-08_13
NNOOPP_01_04_05-08
QQRRSS_09_11_13_14
dt=current data table();
(dt << New Column( "ProductID", Character )) << Set Selected;
(dt << New Column( "OUTPUT", Character )) << Set Selected;
//Parse string in ProductName column
For Each Row(
dt,
//Assign the ProductID value
:ProductID = Word( 1, :ProductName, "_-" ); //"_"
//If the ProductName changes, capture the start and end
If( :ProductName != Lag( :ProductName, 1 ),
start = Num( Word( 2, :ProductName, "_-" ) );
end = Num( Word( 3, :ProductName, "_-" ) );
);
//Assign the OUTPUT value
:OUTPUT = :ProductID || "-" || Repeat( "0", 2 - Length( Char( start ) ) ) || Char( start );
//After end value & there is an _, set start to value after _
If( start == end & Contains( :ProductName, "_"),
start = Num( Word(-2, :ProductName, "_-" ) ),
start++);
);
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut jthi,
Merci pour le script mais ma table est en fait dynamique. Chaque jour, je vais extraire cette table d'une base de données avec une plage de dates différente et différents ensembles de ProductName apparaîtront. Ce n'est donc pas toujours 32 lignes. Votre script peut presque fonctionner, mais pouvez-vous régler la taille du tableau ? Merci.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneCela devrait être assez facile. Avez-vous autant de lignes dans les données extraites que de numéros de série ?
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut jthi,
Oui, le nombre de lignes correspond au nombre de numéros de série.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSi tel est le cas, il devrait déjà être capable de le gérer. J'ai fait de petites modifications (création de la colonne OUTPUT si elle est manquante). Actuellement, il repose sur le fait que la table de données est triée par ProductNames, ce qui peut causer des problèmes à un moment donné, ou alors vous pouvez vous assurer que la table d'entrée est triée (solution la plus simple).
Vous devriez pouvoir utiliser la partie For Each peut même être utilisée sans table de données tant que vous avez une variable de liste nommée uniqProd qui a ProductNames. Après cela, il suffit de comprendre comment ajouter des valeurs à datatable.
Names Default To Here(1);
//Test table
/*
dt = New Table("Untitled 4993",
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
)
);
*/
dt = Current Data Table();
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd, //loop for each ProductName
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges, //Loop for serialnumber inside the ProductName
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
//if starting table doesn't have OUTPUT column create it
If(!Contains(dt << Get Column Names("String"), "OUTPUT"),
dt << New Column("OUTPUT", Character, "Nominal");
);
//dt[0,"OUTPUT"] = valList; subscripting, maybe a bit more difficult to understand
dt:OUTPUT << Set Values(valList);
Version simplifiée de ce qu'ils essaient de faire :
1. Le script obtient toutes les valeurs uniques dans la colonne ProductName
2. Boucles de script sur chacune de celles en deux parties pour chaque boucle
3. La première boucle boucle sur les valeurs uniques et les divise en parties de produit et de nombre
4. La partie Serialnumber est ensuite rebouclée pour la diviser en valeurs uniques. Ces valeurs uniques sont concaténées avec la partie Product, puis la chaîne est insérée dans la liste valList (ceci 4. n'est pas aussi simple que je l'ai expliqué ici).
5. Une fois les deux boucles terminées, vous devriez avoir une liste contenant tous les numéros de série possibles. La partie produit sera classée par ordre alphabétique.
6. Cette liste est ensuite ajoutée à OUTPUT si elle existe, sinon elle est d'abord créée.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut jti,
Votre script ne fonctionnera pas si mon ProductName est un mélange de caractères et de chiffres. J'ai joint un tableau. Voici à quoi ressemblera la plupart de mes productName. Merci de m'avoir aidé.