Brauchen Sie Hilfe bei JSL-Skripten, um Spaltendaten mit Trennzeichen aufzuteilen und mit einem anderen Spaltentrennzeichen abzugleichen?Hallo Leute
Ich verwende JMP17 und brauche wirklich Hilfe beim JSL-Skript, um die folgenden Eingabedaten in die gewünschten Ausgabedaten zu verarbeiten
Eingabedatentabelle:
| Daten| Bezeichnung | ID |
|----------|----------|----------|
| 1_1_64_5_2 | D1_DD4_FF1_FIN1_GPES2 | Apple1 |
| 1_1_2 | D2_D3_D4 | Apple1 |
| 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 | Traube1 |
| 2_1_2 | D2_D3_D4 | Traube1 |
Ausgabeformat: (die Reihenfolge der Spalten spielt keine Rolle)
| ID| Bezeichnung| Daten|
|----------|----------|----------|
| Apfel1 | D1 | 1 |
| Apple1 | DD4 | 1 |
| Apple1 | FF1 | 64 |
| Apple1 | FIN1 | 5 |
| Apple1 | GPES2 | 2 |
| Apfel1 | D2| 1 |
| Apfel1 | D3| 1 |
| Apple1 | T4 | 2 |
| Orange1| T1 | 1 |
| Orange1| DD4 | 2|
| Orange1| FF1 | 68|
| Orange1| FIN1 | 5 |
| Orange1| GPES2 | 6 |
| Orange1| D2| 1 |
| Orange1| T3| 2 |
| Orange1| T4 | 2 |
| Traube1 | T1 | 2 |
| Traube1 | DD4 | 1|
| Traube1 | FF1 | 50|
| Traube1 | FIN1 | 3 |
| Traube1 | GPES2 | 10 |
| Traube1 | D2| 2 |
| Traube1 | T3| 1 |
| Traube1 | T4 | 2 |
Automatisierung und SkriptingGrundlegende Datenanalyse und ModellierungDatenzugriffBetreff: Brauche Hilfe beim JSL-Scripting, um Spaltendaten mit Trennzeichen aufzuteilen und mit einem anderen Spaltentrennzeichen abzugleichen. Daten aufteilenKönnen Sie eine Beispieltabelle bereitstellen? Es ist etwas schwierig, die Ausgangssituation nur anhand des Textes zu verstehen.
Betreff: Brauche Hilfe beim JSL-Scripting, um Spaltendaten mit Trennzeichen aufzuteilen und mit einem anderen Spaltentrennzeichen abzugleichen. Daten aufteilenIch gehe davon aus, dass alle Beschriftungs- und Datenwerte die gleiche Anzahl von Elementen enthalten. Wenn ja, würde dies funktionieren. Wenn nicht, müsste etwas mehr Logik hinzugefügt werden, um dies zu überprüfen, aber dies wäre eine schnelle Möglichkeit, Ihre Daten zu verarbeiten.
// this would be whatever your input table name is<BR />dt0 = Data table("Input Table");
dt1 = new table("Output table");
dt1<<NEW column=""></NEW>Betreff: Brauche Hilfe beim JSL-Scripting, um Spaltendaten mit Trennzeichen aufzuteilen und mit einem anderen Spaltentrennzeichen abzugleichen. Daten aufteilenIch bin nicht sicher, was der Ausgangspunkt ist, daher gehe ich davon aus, dass Sie eine Datentabelle und keine Textdatei haben.

Wählen Sie die Daten- und Beschriftungsspalte aus und verwenden Sie Text in Spalten darauf

Entfernen Sie diese „alten“ Spalten (oder verschieben Sie sie ans Ende).
Stapeln Sie als Nächstes Ihre Daten mithilfe mehrerer Serienstapel

Löschen Sie zusätzliche Spalten, ordnen Sie Spalten neu an und benennen Sie sie um

Fehlende Zeilen löschen

Überprüfen Sie die Ergebnisse und übernehmen Sie das von JMP für Sie erstellte Skript (oder den Workflow).
Der Workflow ist ebenfalls beigefügt (erfordert möglicherweise einige Bereinigungen) und ein bereinigtes Skript basierend auf dem folgenden Workflow (kann je nach Bedarf wesentlich robuster gestaltet werden):
Mehr anzeigen...
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;
Betreff: Brauche Hilfe beim JSL-Scripting, um Spaltendaten mit Trennzeichen aufzuteilen und mit einem anderen Spaltentrennzeichen abzugleichen. Daten aufteilenIch würde einige Verbesserungen vorschlagen:
- Verwenden Sie Current Data Table() grundsätzlich nicht. In diesem Fall könnten Sie zwar die ursprüngliche Tabelle verwenden, müssen diese aber nicht ständig ändern, da die Referenzen bereits vorhanden sind (z. B. ist current data table(dt1); unnötig und könnte Probleme verursachen).
- Führen Sie bei der Verwendung von „For Each Row“ eine Schleife über eine bestimmte Tabelle durch und verlassen Sie sich nicht auf die aktuelle Tabelle (for each row(dt0,...)).
- Sie können auch For Each + Across verwenden, um mehrere Container zu durchlaufen. Sie können auch unterschiedliche Verhaltensweisen erzwingen, wenn Sie Across verwenden, um Container unterschiedlicher Länge zu verarbeiten.
- Wenn Sie die Spaltennamen und -werte kennen, können Sie bereits mit << Zeilen hinzufügen Werte hinzufügen, aber das kann ein Chaos sein (normalerweise füge ich Zeilen hinzu, wie Sie es getan haben, und füge danach Werte hinzu).
Mehr anzeigen...
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});
);
);