Je suis nouveau sur JSL. J'ai une chaîne de texte contenant des valeurs séparées par un "#". Les numéros sont à regrouper en 3 colonnes
Je sais que je peux écrire un code pour mettre les valeurs dans des colonnes séparées par le "#", mais comment créer ensuite un tableau de 3 valeurs dans chaque ligne, jusqu'à ce que le tableau soit complet. Je sais que je devrai probablement aussi supprimer le premier "#" pour éviter les problèmes, car les 3 premiers chiffres seraient dans la 2e à la 4e colonne.
Par exemple:
| #1#0.93#0.99#2#1.92#1.99#3#2.9#2.99#4#3.86#3.98#5#4.85#4.98 |
on peut aller à ça :
1 | 0,93 | 0,99 | 2 | 1,92 | 1,99 | 3 | 2.9 | 2,99 | 4 | 3,86 | 3,98 | 5 | 4,85 | 4,98 |
Mais comment écrire le code JSL pour arriver à ceci :
| Valeur1 | Valeur2 | Valeur3 |
| 1 | 0,93 | 0,99 |
| 2 | 1,92 | 1,99 |
| 3 | 2.9 | 2,99 |
| 4 | 3,86 | 3,98 |
| 5 | 4,85 | 4,98 |
Dans cet exemple, le tableau comporte 5 lignes mais le nombre de lignes peut varier.
Utilisez Text To Columns pour obtenir ceci

Empilez ensuite vos données avec une pile de plusieurs séries

et enfin, supprimez les colonnes supplémentaires, renommez les en-têtes de colonnes et corrigez les types de données/modélisation des colonnes.

Le script créé par JMP est un bon point de départ pour le JSL final
// Text to columns
Data Table("Untitled 6") << Text to Columns(columns(:Column 1), Delimiters("#"));
// Stack data table
// → Data Table("Untitled 11")
Data Table("Untitled 6") << Stack(
columns(
:Column 1 1, :Column 1 2, :Column 1 3, :Column 1 4, :Column 1 5, :Column 1 6,
:Column 1 7, :Column 1 8, :Column 1 9, :Column 1 10, :Column 1 11,
:Column 1 12, :Column 1 13, :Column 1 14, :Column 1 15
),
Source Label Column("Label"),
Stacked Data Column("Data"),
Drop All Other Columns(1),
Number of Series(3),
Output Table("Untitled 11.jmp")
);
// Delete columns
Data Table("Untitled 11") << Delete Columns(:Label, :Label 2, :Label 3);
// Recode column names
Local({dt = Data Table("Untitled 11"), names},
names = Recode(
dt << Get Column Names(String),
{Map Value(
_rcOrig,
{"Data", "Value1", "Data 2", "Value2", "Data 3", "Value3"},
Unmatched(_rcNow)
)}
);
For Each({name, i}, names, Column(dt, i) << Set Name(name));
);
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("Untitled 11"));
For Each({col, index}, {:Value1, :Value2, :Value3},
col << Data Type(Numeric, Format("Best", 12)) <<
Set Modeling Type("Continuous")
);
Current Data Table(old dt);
);Voici une approche
Names Default To Here( 1 );
theString = "#1#0.93#0.99#2#1.92#1.99#3#2.9#2.99#4#3.86#3.98#5#4.85#4.98";
dt = New Table( "Start",
add rows( 1 ),
New Column( "string", character, set each value( theString ) )
);
dt << Text To Columns( delimiter( "#" ), columns( :string ) );
dt << delete columns( :string );
colNames = dt << get column names( string );
For Each( {col}, colNames,
Column( dt, col ) << Data Type( Numeric, Format( "Best", 12 ) ) <<
Set Modeling Type( "Continuous" )
);
dt << Stack(
columns( colNames ),
Source Label Column( "Label" ),
Stacked Data Column( "Value" ),
Number of Series( 3 ),
Output Table( "Final" )
);
dtFinal = Current Data Table();
dtFinal << delete columns( {:Label, :Label2, :Label3} );
dtFinal:value << set name( "Value 1" );
close( dt, nosave);
