Benennen Sie Spaltennamen in einer JMP-Datei gemäß den Werten in Zeilen in einer separaten CSV-Datei umHallo,
Ich bin ein Neuling bei JSL, also schätze Hilfe.
Ich habe drei Dateien.
Datei Nr. 1: Dies ist die Referenzdatei [als ref.csv], die 3 Spalten wie unten enthält.
Kategorie, Breite, Etikett
--------------------------------
A, 0, L1.abc
A, 1, L2.xt
A, 2, L8.dr
A, 3, L20.ws
A, 4, L72.oz
B, 0, L11.qq
....
B, 6, L61.er.
Datei Nr. 2: Datendatei Nr. 1 in JMP mit Kategorie, Daten und vielen anderen Spalten.
Datei Nr. 3: Datendatei Nr. 2 in JMP mit Kategorie, Daten und vielen anderen Spalten.
Der Unterschied zwischen den beiden Datendateien [Datei 2 und Datei 3] ist der Kategorietyp und die Wertbreite in der Datenspalte.
Datendatei Nr. 1:
Kategorie | Daten | viele Spalten .....
----------------------------------------
A 123.23 ....
A 321,45 ....
..... .....
viele Zeilen
Die Breite der Werte in der Spalte "Daten" [ohne die Punkte] stimmt mit der Anzahl der Zeilen in Datei 1 für eine bestimmte Kategorie überein
Beispiel:
Die Breite von 123,23 in Zeile 1 in Datendatei Nr. 1 beträgt 5.
Die Anzahl der Zeilen in der Referenzdatei für Kategorie A wäre 5. Dies muss nicht per say getestet werden. Auf diese Weise kommen die Tabellen herein [dh wenn sie aus der Quelle gezogen werden]
In Zukunft wird in der Referenzdatei, beispielsweise für Kategorie A, die Anzahl der Zeilen auf 6 oder mehr erhöht, und die Breite des Werts in der Datenspalte in der Datendatei Nr. 1 würde sich auch erhöhen, wenn Informationen aus der Datenbank abgerufen werden.
Datendatei Nr. 2:
Kategorie | Daten | viele Spalten .....
----------------------------------------
B 1236.23 ....
B 3213.45 ....
..... .....
viele Zeilen
Ziel 1: Erstellen Sie neue Spalten in Abhängigkeit von der Breite des Werts, der in der Spalte "Daten" in der Datendatei Nr. 1 [und anderen Datendateien] enthalten ist.
Ich bin mit Ziel 1 fertig!
Ex:
Die aktualisierte Datendatei Nr. 1 würde folgendermaßen aussehen:
Kategorie | Daten | c1 | c2 | c3 | c4 | c5 | viele Spalten .....
----------------------------------------
A 123,23 1 2 3 2 3 ....
A 321,45 3 2 1 4 5 ....
..... .....
Ziel 2: Benennen Sie die neuen Spalten in der Datendatei Nr. 1 [dh c1 bis c5] in L1 ... bis L72 ... um, wie in der Spalte "label" in der Referenzdatei definiert. Keine Änderung der Zellenwerte. Aktualisieren Sie einfach die ausgewählten Spaltennamen.
erwartete Ausgabe nach Ziel 2:
Aktualisieren Sie die Datendatei Nr. 1 so:
Kategorie | Daten | L1.abc | L2.xt | L8.dr | L20.ws | L72.oz | viele Spalten .....
----------------------------------------
A 123,23 1 2 3 2 3 ....
A 321,45 3 2 1 4 5 ....
..... .....
Ich brauche Hilfe bei Ziel 2.
Für Ziel 2 habe ich die Referenzdatei geöffnet, bin mir aber nicht sicher, ob ich vorwärts gehen soll.
Vielen Dank
David
DatentabelleBetreff: Benennen Sie Spaltennamen in einer JMP-Datei gemäß den Werten in Zeilen in einer separaten CSV-Datei umHier ist ein ungetestetes Skript, das Ihrem zweiten Ziel ziemlich nahe kommen sollte
dtCat = Data Table( "file#1 name" );
dt1 = Data Table( "file#2 name" );
dt2 = Data Table( " file#3 name" );
// add dt3, dt4 etc. for each of the categories you have
// Find the number of data tables to process....A B C......
// Create a temporary new column in data table dtCat that has just the category
dtCat << New Column( "temp", character, formula( Word( 1, :data, "." ) ) );
// Summarize the data getting one element in the ByGroup list for each Category found
Summarize( dt, Categories = ByGroup( :temp ) );
numCategories = N Items( Categories );
For( i = 1, i <= numCategories, i++,
// Subset the dtCat table into the a new data table with just the one
// category being processed
dtCat << select where( :temp == Categories[i] );
dtSub = dtCat << subset( selected rows == 1, selected columns( 0 ) );
// set the offset of where to start the renaming
offset = 3;
// Loop
// Change names in dt1 to match the Label in
For( k = 1, k <= N Rows( dtSub ), k++,
Eval(
Substitute(
Expr(
Column( __dt__, k + offset ) << set name( Word( 3, dtSub:Data[k], "." ) ),
Expr( __dt__ ),
Parse( "dt" || Char( i ) )
)
)
)
);
Close( dtSub, nosave );
);Betreff: Benennen Sie Spaltennamen in einer JMP-Datei gemäß den Werten in Zeilen in einer separaten CSV-Datei umDanke Jim.Es funktioniert nicht.
Für Ziel 2 habe ich die gesamte Logik in Werteschritte unterteilt.
Schritt 1: Holen Sie sich die Kategorienamen aus der Datentabelle [sagen Sie dt1] und speichern Sie sie in einer Variablen [sagen wir, sie enthält die Kategorie A] - FERTIG
Schritt 2: Lesen Sie die Variable aus Schritt 1 und suchen Sie alle Zeilen, die mit Kategorie = A übereinstimmen. Abrufen von Beschriftungsnamen aus der Spalte "Beschriftung" aus der ref.csv [die Sie als dtCat aufgerufen haben] und Speichern in einer Liste oder Variablen. [sag es heißt category_list]
Verwenden Sie also das in der Diskussion angegebene Beispiel. Ich erwarte, dass category_list unter den Werten liegt.
category_list = L1.abc, L2.xt, L8.dr, L20.ws, L72.oz
Ich weiß nicht, wie ich das machen soll. Schätzen Sie die Hilfe.
Schritt 3: Überprüfen Sie die Anzahl in der Liste == Nr. von neuen Spalten in der dt1 erstellt. Dies ist eine zusätzliche Sache, die ich für Robustheit tue.
Die Anzahl in category_list beträgt 5 Elemente
Neue Spalten, die in dt1 erstellt wurden, sind 5. [Ich habe dies von Ziel 1 erhalten, da ich eine Variable halte, um herauszufinden, wie viele neue Spalten benötigt werden].
Schritt 4: Ersetzen Sie die Spaltennamen in dt1, dh c [i], durch Liste [i] unter Verwendung einer Schleife mit i = 5
c1 ersetzt
Ich bin gerade in Schritt 2 und brauche Hilfe.
Vielen Dank,
David
Betreff: Benennen Sie Spaltennamen in einer JMP-Datei gemäß den Werten in Zeilen in einer separaten CSV-Datei um- Sie geben an, dass mein letzter Code nicht funktioniert ..... warum nicht?
- Hier ist eine Möglichkeit, die Liste zu erstellen, nach der Sie fragen
Category_List = {};
For( i=1, i<= N Rows( dtCat ), i++,
insert into(Category_List, word(3,:data[i],".") || "." || word(4,:data[i], "." ) );
);
Betreff: Benennen Sie Spaltennamen in einer JMP-Datei gemäß den Werten in Zeilen in einer separaten CSV-Datei umIch habe mir den von Ihnen angegebenen Code angesehen. Es scheint einige Verwirrung zu geben.
So habe ich mich abgefangen und korrigiert, es ist falsch.
dtcat ist die Referenztabelle mit dem Spaltennamen [ Kategorie, Breite, Etikett].
es gibt mehrere Datentabellen dt1, dt2 usw. mit derselben Struktur mit Spaltennamen [Kategorie | Daten | viele Spalten .....]
Wenn ich den Code ausführe, geschieht nichts
Es gibt keine Spalte mit dem Namen data in der dtcat-Tabelle, die im Debug untersucht wurde.
Vielleicht meinten Sie dt1 Tabelle, da es sich um eine Datenspalte handelt.
Ich habe versucht herumzuspielen und es würde nicht helfen.
Ich denke, wir stimmen mit den Definitionen in der Tabelle überein. Verwenden Sie das, was ich im ursprünglichen Beitrag beschrieben habe. Ich könnte meiner Meinung nach helfen.
Schätzen Sie noch einmal die Hilfe hier.
Lassen Sie mich die Empfehlung für Schritt 2
Vielen Dank
David
Betreff: Benennen Sie Spaltennamen in einer JMP-Datei gemäß den Werten in Zeilen in einer separaten CSV-Datei umJim,
Für Schritt 2 mit den folgenden Modifikationen [siehe unten]
++++
das ist meine ref.csv:
Kategorie | Breite | Etikett
ABC 0 label0.0
ABC 1 label0.1
ABC 2 label0.2
ABC 3 label0.3
ABC 4 label0.4
ABC 5 label0.5
ABC 6 label0.6
ABC 7 label0.7
ABC 8 label0.8
ABC 9 label0.9
ABC 10 label0.10
ABC 11 label0.11
ABC 12 label0.12
ABC 13 label0.13
ABC 14 label0.14
ABC 15 label1.15
ABC 16 label0.16
ABC 17 label0.17
ABC 18 label0.18
ABC 19 label0.19
ABC 20 label0.20
B 0 label11.22
C 1 label11.21
D 2 label11.23
E 0 label11.24
Mein Code:
dt_ref = Open ("ref.csv");
Für (i = 1, i <= N Zeilen (dt_ref), i ++,
einfügen in (Category_List, word (1 ,: label [i], ".") || "." || Wort (2 ,: Bezeichnung [i], "."));
);
show (Category_List);
+++
Ich bekomme folgendes im Protokoll:
Category_List = {"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7" , "label0.8", "label0.9", "label0.10", "label0.11", "label0.12", "label0.13", "label0.14", "label1.15", " label0.16 "," label0.17 "," label0.18 "," label0.19 "," label0.20 "," label11.22 "," label11.21 "," label11.23 "," label11 ". 24 ",". ",". "};
Ich möchte, dass die Beschriftungen nur ausgewählt werden, wenn die Kategorie ABC ist. wie mache ich das?
Ich habe Folgendes versucht, aber für die Category_List wird nichts zurückgegeben:
prod_found = {"ABC"};
if (: product == prod_found,
Für (i = 1, i <= N Zeilen (dt_ref), i ++,
einfügen in (Category_List, word (1 ,: name [i], ".") || "." || Wort (2 ,: Name [i], "."));
);
);
Vielen Dank,
David
Betreff: Benennen Sie Spaltennamen in einer JMP-Datei gemäß den Werten in Zeilen in einer separaten CSV-Datei umEntschuldigung für meine Fehlinformationen.Ich habe die Struktur der Kategoriedatentabelle falsch verstanden.Unten finden Sie ein Skript, das einige Datentabellen und eine Kategorietabelle erstellt, die Datentabellen erweitert und schließlich die Spalten basierend auf den Einträgen in der Kategoriedatentabelle umbenennt.Ich hoffe, das bringt uns wieder auf die Strecke.Das Skript bearbeitet so viele Datentabellen wie nötig.Sie müssen lediglich alle zu verarbeitenden Datentabellen zur dataTableList-Liste hinzufügen
Names Default To Here( 1 );
// This example script opens up 2 data tables and 1 category table.
// In reality, as many as necessary data tables could be used
// Create the tables
dt1 = New Table( "Table1",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"ABC", "ABC", "ABC"} ) ),
New Column( "DATA", Character( 33 ), "Nominal", Set Values( {"123.56.8.342", "431.02.0.567", "318.00.1.816"} ), Set Display Width( 182 ) )
);
dt2 = New Table( "Table2",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"B", "B", "B"} ) ),
New Column( "Data", Character, "Nominal", Set Values( {"13.24", "98.44", "63.89"} ) )
);
dtCat = New Table( "The Categories",
Add Rows( 13 ),
New Column( "Category",
Character,
"Nominal",
Set Values( {"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "B", "B", "B", "B"} ),
Set Display Width( 67 )
),
New Column( "Width", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3] ) ),
New Column( "Label",
Character( 16 ),
"Nominal",
Set Values(
{"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7", "label0.8", "thelabel.1", "thelabel.2",
"thelabel.3", "thelabel.4"}
),
Set Display Width( 99 )
)
);
// Below this line, is the script that will add the new columns to each of the data tables
// and will take the names from the dtCat (Categories) data table and change the names to
// the columns in each of the data tables
// Create a list of the pointers to the data tables. This will allow for the using of the list
// entries to point to the data tables using a subscript
dataTableList = {};
insert into(dataTableList, dt1 );
insert into(dataTableList, dt2 );
// Loop across the data table list and expand the columns based upon the the column called Data
For( i = 1, i <= N Items( dataTableList ), i++,
ncols_to_add = length( substitute((dataTableList[i]:Data)[1],".",""));
For( k = 1, k <= ncols_to_add, k++, // the || operator joins two strings
dataTableList[i] << New Column( "c" || Char( i ),
Numeric,
Continous,
<<SET each="" value=""></SET>