Analysieren Sie den String einer Spalte und füllen Sie eine andere SpalteHi,
Ich habe eine Tabelle mit ProductName und möchte die OUTPUT-Spalte generieren.Die OUTPUT-Spalte ist eine Verkettung von ProductID mit Serial#. Wie kann ich die Serial# genau analysieren und die OUTPUT-Spalte erstellen?
Beispiele für Seriennummern:
- 07-08_13 bedeutet Seriennummer 07, 08, 13
- 09-12 bedeutet Seriennummer 09, 10, 11, 12
- 01-03_05-08 bedeutet Seriennummer 01, 02, 03, 05, 06, 07, 08
- 01_04_05-08 bedeutet Seriennummer 01, 04, 05, 06, 07, 08
- 09_11_13_14 bedeutet Seriennummer 09,11,13,14

| Produktname | AUSGANG |
| 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 |
DatentabelleSkriptingRe: String einer Spalte parsen und eine andere Spalte füllenWahrscheinlich könnten Sie dafür eine Formel mit Lag schreiben (oder ein Skript mit JSL), aber Sie können dies auch interaktiv versuchen, aber es sind einige Schritte erforderlich:
1. Spalte Produktname auswählen
2. Gehen Sie zu Cols/Utilities/Text To Spalten und verwenden Sie sowohl - als auch _ als Trennzeichen

3. Gehen Sie zu Tabellen und Stapel und fügen Sie alles andere außer der ersten Spalte zur Auswahl der Stapelspalten hinzu


5. Label-Spalte entfernen
6. Wählen Sie die beiden verbleibenden Spalten aus und gehen Sie zu Zeilen / Zeilenauswahl / Wählen Sie doppelte Zeilen und löschen Sie diese Zeilen

7. Wählen Sie eine Zelle mit leerem Wert aus und wählen Sie Passende Zellen auswählen und löschen Sie diese Zeilen
8. Wählen Sie nun beide Spalten aus und klicken Sie mit der rechten Maustaste auf die Spaltenüberschrift und erstellen Sie eine Formel

9. Öffnen Sie die soeben erstellte Formel und ändern Sie , in _

10. Spalten/Formeln umbenennen und löschen
11. Wenn Sie haben müssen ProductName dort, Sie sollten es dort behalten können, wenn Sie es nicht im ersten Schritt versehentlich löschen, wie ich es getan habe

Wenn Sie haben müssen - oder _ je nach Seriennummer können Sie es am wahrscheinlichsten in der verketteten Formel behandeln
Bearbeiten: Ich habe die Frage etwas genauer überprüft und das ist etwas komplizierter, als ich hier gezeigt habe. Sie müssen Berechnungen für einige der Seriennummern hinzufügen, da sie zwischen Zahlen liegen. Diese Lösung funktioniert in diesen nicht, da einige Zeilen entfernt werden, wenn Duplikate entfernt werden.
Re: String einer Spalte parsen und eine andere Spalte füllenHi @cchueng ,
Es gibt ein paar Möglichkeiten. Einige basieren auf Skripten (suchen Sie nach einer Antwort von jemandem, der dies mit einem Beispiel vorschlägt) oder Sie könnten aufeinanderfolgende Runden von Text zu Spalten verwenden (Beispiel finden Sie hier Gelöst: Wie kann ich Text in einer Spalte in mehrere Spalten aufteilen? - JMP-Benutzergemeinschaft) Dann könnten Sie die gewünschten Spalten verketten, indem Sie sie auswählen und dann entweder eine Spaltenformel verwenden oder die Option Neue Formelspalte verwenden, nachdem Sie mit der rechten Maustaste auf eine der ausgewählten Spalten geklickt haben. Suchen Sie nach den Zeichenoptionen für concat.Die Spaltenformel ist flexibler und bietet Ihnen viele Optionen siehe Hilfe zu diesem Thema ( Erstellen von Formeln in JMP )
Ich hoffe, das gibt dir eine Orientierung.
Am besten,
Re: String einer Spalte parsen und eine andere Spalte füllen@jthi ,
Du warst schneller als ich.
Deine Erklärung ist ausführlicher und was ich auch gedacht habe.
Re: String einer Spalte parsen und eine andere Spalte füllenAch, du hast recht. das - wird als Bereich interpretiert und das _ wird als echtes Trennzeichen von Elementen interpretiert
Re: String einer Spalte parsen und eine andere Spalte füllenDanke, aber ich bevorzuge ein jsl anstelle des interaktiven Trennzeichens. Ihre Methode hat das Szenario nicht angesprochen, wenn die Seriennummer 09-12. Es sollte Zeilen wie unten ausgeben. Nicht nur AABBCC-09 und AABBCC-12. Das "-" bedeutet "bis", was den Bereich bedeutet. 09-12 bedeutet also 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: String einer Spalte parsen und eine andere Spalte füllenOkay, das könnte funktionieren. Erfordert JMP16 aufgrund der Verwendung von For Each (kann für andere Versionen durch For ersetzt werden. Dies ist eine stark geskriptete Lösung mit wenigen oder keinen Kommentaren und erfordert eine bestimmte Starttabelle, um zu funktionieren (benötigt OUTPUT-Spalte).
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;Ich frage mich, ob so etwas "einfach" mit JMPs eigenem Musterabgleich möglich ist @Craige_Hales
Re: String einer Spalte parsen und eine andere Spalte füllenHallo Chris,
Ich habe ein Skript, das einen Teil des Produktnamens anspricht und manchmal falsch analysiert. Können Sie Codes überprüfen und hinzufügen, um die bisher nicht funktionierenden Produktnamen zu adressieren?
Funktioniert für die folgenden Beispiele:
EEFFGG_02
HHIIJJ_01-07
KKLLLMM_01-03_05-08
Funktioniert noch nicht für die folgenden Beispiele:
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: String einer Spalte parsen und eine andere Spalte füllenHallo jthi,
Danke für das Skript, aber meine Tabelle ist tatsächlich dynamisch. Jeden Tag rufe ich diese Tabelle aus einer Datenbank mit einem anderen Datumsbereich auf und verschiedene Sätze von Produktnamen werden angezeigt. Es sind also nicht immer 32 Zeilen. Ihr Skript kann fast funktionieren, aber können Sie die Array-Größe ansprechen? Vielen Dank.
Re: String einer Spalte parsen und eine andere Spalte füllenEs sollte ziemlich einfach sein. Haben die abgerufenen Daten so viele Zeilen wie Seriennummern?
Re: String einer Spalte parsen und eine andere Spalte füllenHallo jthi,
Ja, die Anzahl der Zeilen stimmte mit der Anzahl der Seriennummern überein.
Betreff: String einer Spalte parsen und eine andere Spalte füllenWenn das der Fall ist, sollte es bereits in der Lage sein, damit umzugehen. Ich habe kleine Änderungen vorgenommen (Erstellung der OUTPUT-Spalte, falls sie fehlt). Derzeit ist es darauf angewiesen, dass die Datentabelle nach ProductNames sortiert ist, was irgendwann zu Problemen führen kann, oder Sie können dann sicherstellen, dass die Eingabetabelle sortiert ist (einfachste Lösung).
Sie sollten in der Lage sein, den For Each-Teil zu verwenden, der sogar ohne Datentabelle verwendet werden kann, solange Sie eine Listenvariable mit dem Namen uniqProd haben, die ProductNames hat. Danach müssen Sie nur noch herausfinden, wie Sie Werte zur Datentabelle hinzufügen.
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);
Vereinfachte Version, was das Skript zu tun versucht:
1. Das Skript ruft alle eindeutigen Werte in der ProductName-Spalte ab
2. Skriptschleifen über jede dieser Schleifen in zweiteiliger For Each-Schleife
3. Die erste Schleife durchläuft die eindeutigen Werte und teilt sie in Produkt- und Zahlenteile auf
4. Der Teil der Seriennummer wird dann erneut geloopt, um ihn in einzelne Werte aufzuteilen. Diese Einzelwerte werden mit Product part verkettet und dann wird der String in die valList-Liste eingefügt (das 4. ist nicht ganz so einfach, wie ich es hier erklärt habe).
5. Nachdem beide Schleifen beendet sind, sollten Sie eine Liste haben, die alle möglichen Seriennummern enthält. Produktteil wird in alphabetischer Reihenfolge sein.
6. Diese Liste wird dann zu OUTPUT hinzugefügt, falls sie existiert, falls nicht, wird sie zuerst erstellt.
Betreff: String einer Spalte parsen und eine andere Spalte füllenHallo jti,
Ihr Skript funktioniert nicht, wenn mein Produktname eine Mischung aus Zeichen und Zahlen ist. Ich habe eine Tabelle angehängt. So wird der Großteil meines Produktnamens aussehen. Danke, dass du mir geholfen hast.