Teilen Sie eine Spalte und erstellen Sie mehrere Multiple basierend auf Split mit JSLHallo,
Ich muss eine vorhandene Tabelle lesen und die gewünschte Spalte finden [sagen wir, der Spaltenname ist "Daten"].
Die Spalte "Daten" ist numerisch mit "Punkt" getrennt und hat die gleiche Länge.
Mein Ziel ist es, diese Tabelle zu öffnen, die Spalte "data" zu lesen, den "Punkt" zu entfernen und neue Spalten [gemäß der Länge des Werts] zu erstellen, und jede Spalte enthält jeden Wert.
Orig.-Tabelle:
Daten
------
123.56.8.342
431.02.0.567
318.00.1.816
.....
erwartete Ausgabe:
Daten c1 c2 c3 c4 c5 c6 c7 c8 c9
-------------------------------------------------- ----------------------------
123.56.8.342 1 2 3 5 6 8 3 4 2
431.02.0.567 4 3 1 0 2 0 5 6 7
318.00.1.816 3 1 8 0 0 1 8 1 6
In meinem ersten Versuch [trial1.jmp] , wo ich 2 for-Schleifen habe [innere Schleife zum Erstellen von Spalten und andere Schleife für # Zeilen], werden mehr Spalten erstellt [dh Breite der gelesenen Daten * nein, Zeilen] .
In meinem zweiten Versuch [trail2.jmp] erhalte ich die richtige Anzahl von Spalten, aber die Werte sind statisch.
angehängt ist mein jsl.
Schätzen Sie die Hilfe und verbrennen Sie das Mitternachtsöl darauf 
Danke,
David
DatentabelleBetreff: Teilen Sie eine Spalte und erstellen Sie mehrere Multiples basierend auf Split mit JSLBeide Methoden haben Vorteile. Die Formelmethode ermöglicht das Hinzufügen neuer Zeilen und das Ändern der Datumswerte, und die c1....cn-Spalten werden automatisch angepasst. Der Vorteil des Festlegens jedes Werts stellt statische Werte bereit, die sich als effizienter erweisen können, da die Formeln nicht mehrmals ausgeführt werden müssen.Betreff: Teilen Sie eine Spalte und erstellen Sie mehrere Multiples basierend auf Split mit JSLDanke Jim.
Sie haben eine elegante Lösung.
Basierend auf Ihrer vorgeschlagenen Methode ist mir aufgefallen, dass der Spaltenname nicht fortgesetzt wird, [dh. überspringt die Spaltennummer, wenn jemals ein "Punkt" angetroffen wird]; Es ist eine kleine Spaltennamen-Massage erforderlich [worauf ich geachtet habe].
Frage:
Würden Sie vorschlagen, dass die Spalte eine Formel hat und eval/substitute verwendet, oder tun Sie dies mit "jeden Wert festlegen", wie Jamo vom Leistungsstandpunkt aus vorgeschlagen hat?
Danke,
David
Betreff: Teilen Sie eine Spalte und erstellen Sie mehrere Multiples basierend auf Split mit JSLDanke Jamo, dass er mich wissen ließ, was mir gefehlt hat. Ich wusste, ich war in der Nähe 
Sie wissen nichts über die eingebaute Funktion "jeden Wert festlegen".
Jup, alles funktioniert!
Danke,
David
Betreff: Teilen Sie eine Spalte und erstellen Sie mehrere Multiples basierend auf Split mit JSLSo würde ich Ihren Wunsch erfüllen.Die Funktion Substitute() ermöglicht es, dass die Formel den tatsächlichen Wert der Variablen „i“ in der Formel enthält, anstatt auf die Variable „i“ zu verweisen.
Names Default To Here( 1 );
dt = Current Data Table();
col = Column( dt, "DATA" );
colLength = Length( col[1] );
For( i = 1, i <= colLength, i++,
If( Substr( col[1], i, 1 ) != ".",
Eval(
Substitute(
Expr(
dt << New Column( "c" || Char( i ), Numeric, Continous, Formula( Num( Substr( :data, __i__, 1 ) ) ) )
),
Expr( __i__ ), i,
)
)
)
);Betreff: Teilen Sie eine Spalte und erstellen Sie mehrere Multiples basierend auf Split mit JSLIch habe nur die Version 2 von .jsl überprüft und es war ziemlich nah dran.
Geänderte Version habe ich beigefügt.
Ich habe hauptsächlich den Loop-Teil modifiziert. Es gibt höchstwahrscheinlich eine Möglichkeit, ohne Eval (Parse ()) mit Ausdrücken auszukommen, aber ich habe mich diesmal für diese Lösung entschieden. Sie haben Daten aus der Variablen clean_DATA verwendet, die für alle Zeilen gleich bleiben. Auch wenn Sie Formeln benötigen, müssen Sie Eval(Parse()) (oder Ausdrücke?) verwenden, damit die Formeln in der Datentabelle funktionieren. Wenn keine Formeln benötigt werden, würde ich << Set Each Value anstelle von Formula verwenden.
For(i = 1, i <= ncols_to_add, i++, // the || operator joins two strings
Eval(Parse("dt << New Column(\!"c\!" || Char(i),Numeric, Continous,
Formula(Num(Substr(Regex(:data, \!"\D\!", \!"\!", GLOBALREPLACE ), "||char(i)||", 1 )));
)));")); // put 1 bit in each column
);Mit << Set Each Value würde die for-Schleife so aussehen:
For(i = 1, i <= ncols_to_add, i++, // the || operator joins two strings
dt << New Column("c" || Char(i),Numeric, Continous,
<< Set Each Value(Num(Substr(Regex(:data, "\D", "", GLOBALREPLACE ), i, 1 )));
)
); // put 1 bit in each column
Bearbeiten:
Guter Beitrag zur Verwendung von Eval Insert, Eval Expr, Parse und Substitute mit Formeln https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998