Besoin d'aide sur les scripts JSL pour diviser les données de colonne avec un délimiteur et les faire correspondre avec un autre délimiteur de colonne Diviser les donnéesSalut les gars
j'utilise JMP17 et j'ai vraiment besoin d'aide sur le script JSL pour traiter les données d'entrée ci-dessous vers les données de sortie souhaitées
Tableau des données d'entrée :
| Données | Étiquette | ID |
|----------|----------|--------------|
| 1_1_64_5_2 | D1_DD4_FF1_FIN1_GPES2 | Apple1 |
| 1_1_2 | D2_D3_D4 | Pomme1 |
| 1_2_68_5_6 | D1_DD4_FF1_FIN1_GPES2 | Orange1 |
| 1_2_2 | D2_D3_D4 | Orange1 |
| 2_1_50_3_10 | D1_DD4_FF1_FIN1_GPES2 | Raisin1 |
| 2_1_2 | D2_D3_D4 | Raisin1 |
Format de sortie : (la disposition de la séquence des colonnes n’a pas d’importance)
| ID | Étiquette | Données |
|----------|----------|--------------|
| Pomme1 | D1 | 1 |
| Pomme1 | DD4 | 1 |
| Pomme1 | FF1 | 64 |
| Apple1 | FIN1 | 5 |
| Apple1 | GPSE2 | 2 |
| Pomme1 | D2| 1 |
| Pomme1 | D3| 1 |
| Pomme1 | D4 | 2 |
| Orange1| D1 | 1 |
| Orange1| DD4 | 2|
| Orange1| FF1 | 68|
| Orange1| FIN1 | 5 |
| Orange1| GPSE2 | 6 |
| Orange1| D2| 1 |
| Orange1| D3| 2 |
| Orange1| D4 | 2 |
| Raisin1 | D1 | 2 |
| Raisin1 | DD4 | 1|
| Raisin1 | FF1 | 50|
| Raisin1 | FIN1 | 3 |
| Raisin1 | GPSE2 | 10 |
| Raisin1 | D2| 2 |
| Raisin1 | D3| 1 |
| Raisin1 | D4 | 2 |
Automatisation et scriptsAnalyse et modélisation de données de baseAccès aux donnéesRe: Besoin d'aide sur les scripts JSL pour diviser les données de colonne avec un délimiteur et les faire correspondre avec un autre délimiteur de colonne Diviser les donnéesPouvez-vous fournir un exemple de tableau ? Il est un peu difficile de comprendre la situation de départ à partir d'un simple texte.
Re: Besoin d'aide sur les scripts JSL pour diviser les données de colonne avec un délimiteur et les faire correspondre avec un autre délimiteur de colonne Diviser les donnéesJe suppose que toutes les valeurs d'étiquette et de données contiennent le même nombre d'éléments. Si c'est le cas, cela fonctionnerait. Sinon, il faudrait ajouter un peu plus de logique pour vérifier cela, mais ce serait un moyen rapide de traiter vos données.
// this would be whatever your input table name is<BR />dt0 = Data table("Input Table");
dt1 = new table("Output table");
dt1<<NEW column=""></NEW>Re : Besoin d'aide sur les scripts JSL pour diviser les données de colonne avec un délimiteur et les faire correspondre avec un autre délimiteur de colonne. Diviser les donnéesJe ne sais pas quel est le point de départ, je suppose donc que vous avez une table de données et non un fichier texte.

Sélectionnez les colonnes Données et Étiquettes et utilisez Texte sur les colonnes.

Supprimez ces « anciennes » colonnes (ou déplacez-les vers la fin).
Ensuite, empilez vos données en utilisant plusieurs séries de piles

Supprimer les colonnes supplémentaires, réorganiser et renommer les colonnes

Supprimer les lignes manquantes

Vérifiez les résultats et prenez le script JMP créé pour vous (ou le workflow).
Le flux de travail est également joint (peut nécessiter un certain nettoyage) et un script nettoyé basé sur le flux de travail ci-dessous (peut être rendu beaucoup plus robuste en fonction de vos besoins) :
Voir plus...
Names Default To Here(1);
dt = Current Data Table();
dt << Text to Columns(columns(:" Data"n, :Label), Delimiters("_"));
dt << Delete Columns(:" Data"n, :Label);
dt_stacked = dt << Stack(
columns(:Data 1, :Data 2, :Data 3, :Data 4, :Data 5, :Label 1, :Label 2, :Label 3, :Label 4, :Label 5),
Number of Series(2),
Contiguous,
Output Table("Stacked result")
);
dt_stacked << Delete Columns(:Label, :Label 2);
Column(dt_stacked, "Data 2") << Set Name("Label");
dt_stacked << Move Selected Columns({:Label}, after(:ID));
dt_stacked << Select Where(:Label == "") << Delete Rows;
Re : Besoin d'aide sur les scripts JSL pour diviser les données de colonne avec un délimiteur et les faire correspondre avec un autre délimiteur de colonne. Diviser les donnéesQuelques améliorations que je suggérerais :
- En règle générale, n'utilisez pas Current Data Table(). Dans ce cas, vous pourriez choisir la table initiale en l'utilisant, mais vous n'aurez pas besoin de la modifier constamment, car vous disposez déjà des références (par exemple, current data table(dt1); est inutile et pourrait poser problème).
- Bouclez sur une table spécifique lors de l'utilisation de For Each Row et ne vous fiez pas à la table actuelle (for each row(dt0,...)
- Vous pouvez également utiliser For Each + Across pour boucler sur plusieurs conteneurs. Vous pouvez également forcer des comportements différents lors de l'utilisation de Across pour gérer des conteneurs de différentes longueurs.
- Si vous connaissez les noms des colonnes et les valeurs, vous pouvez déjà ajouter des valeurs avec << Ajouter des lignes, mais cela peut être un désastre (généralement, j'ajoute des lignes comme vous l'avez fait et j'ajoute des valeurs après)
Voir plus...
Names Default To Here(1);
dt_input = Current Data Table();
// dt_input = Data table("Input Table");
dt_result = New Table("Output table");
dt_result << New Column("ID", Character, Nominal);
dt_result << New column("Label", Character, Nominal);
dt_result << New Column("Data", Character, Nominal);
For Each Row(dt_input,
id_val = Column(dt_input, "ID")[];
data_vals = Words(Column(dt_input, "Data")[], "_");
label_vals = Words(Column(dt_input, "Label")[], "_");
For Each({{cur_label, cur_data}}, Across(label_vals, data_vals),
dt_result << Add Rows({ID = id_val, Label = cur_label, Data = cur_data});
);
);