Tabellenweites Suchen und Ersetzen in einem Skript<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich habe mehrere große Datentabellen (+100.000 Datensätze), die von einem Kollegen in Europa erstellt wurden.
Bei der Erstellung der Tabellen wurde das EU-Nummerierungsformat verwendet, dh „“, ist der Dezimalpunkt.
Ich muss eine tabellenweite Ersetzung durchführen, um das „“, durch ein „“ zu ersetzen. damit die Tabelle mit vorhandenen Skripten funktioniert.
Ich kann die Spaltennamen mit der Anweisung „get Column Names()“ abrufen, aber ich weiß nicht, wie ich die Anweisungen „substitute(...)“ oder „substitute into(...)“ verwenden kann, um eine Massenersetzung durchzuführen.
David
Betreff: Tabellenweites Suchen und Ersetzen in einem SkriptHallo David,
Ich hatte das gleiche, aber umgekehrte Problem – eine globale Ersetzung von Punkt zu Komma Trennzeichen in einer Reihe von Prozessprotokolldateien.
Ich habe festgestellt, dass der einfachste Weg, dies zu umgehen, darin besteht, jede JMP-Datei als Textdatei zu speichern und sie dann mit der Option „Best Guess“ von JMP zu importieren.
Es ersetzte die ursprünglichen Trennzeichen durch das vom System erwartete (in meinem Fall wurde „.“ durch „“, ersetzt) und klassifizierte die Spalten von kategorisch in kontinuierlich. Habe eines manuell erstellt und die Quelle für ein Skript verwendet, das den Rest verarbeitet.
Betreff: Tabellenweites Suchen und Ersetzen in einem SkriptInteressante Diskussion.Ich habe mit etwas Code herumgespielt und es verstanden 49 Sekunden für eine globale Spaltenumbenennung von 65394 Spalten.Lenovo T420 PC, Windows 7 64-Bit, JMP 64-Bit, 4 GB RAM.
dt = offen ( „$sample_data\Probe.jmp“ ) ;
// Erweitern Sie die Anzahl der Spalten auf 65000
// ACHTUNG dauert ca. 10 Minuten!
für ( ich = 1 , ich <= 65000 , ich ++,
dt << neue Kolumne ( „XYZ“ || verkohlen ( ich ) , Numerisch , Kontinuierlich ) ;
) ;
start_dt = Heute () ;
col_name_list = dt << Spaltennamen abrufen ( Zeichenfolge ) ;
nc = ncols ( dt ) ;
Für ( ich = 1 , ich <= nc , ich ++,
one_col_name = col_name_list [ ich ] ;
// Benennen Sie die Spalte nur um, wenn sie die betreffende Zeichenfolge enthält
Wenn ( enthält ( one_col_name , "X" ) ,
Spalte ( ich ) << Name einsetzen ( Ersatz ( one_col_name , "X" , "D" )) ;
) ;
) ;
end_dt = Heute () ;
drucken ( verkohlen ( end_dt - start_dt ) || „Sekunden für“ || verkohlen ( nc ) || " Säulen" ) ;
Betreff: Tabellenweites Suchen und Ersetzen in einem SkriptIch habe versucht, den Suchdialog mit der folgenden Vorgehensweise aufzurufen, aber er funktioniert nicht zuverlässig. Scheint, als würde der Dialog getrennt, wenn Einstellungen per Skript bearbeitet werden. Aber vielleicht kann jemand einen Weg finden, den Code zu verbessern.
Wenn diese ungewöhnlich große Datei von außerhalb von JMP stammt, kann es effizienter sein, die Spaltennamen vor dem Import zu bearbeiten, z. B. durch ein Perl- oder VBA-Skript, das möglicherweise von JSL aus ausgelöst werden kann (kann von der Plattform abhängen).
dt = aktuelle Datentabelle () ;
alt = "C" ;
Neu = "Q" ;
dt << Bringen Sie das Fenster nach vorne ;
// Suchdialog aufrufen und Einstellungen bearbeiten
Hauptmenü ( "Finden" ) ;
w = Fenster ( „Suchdialog“ ) ;
w [ Texteditbox ( 1 )] << Text setzen ( alt ) ;
w [ Texteditbox ( 2 )] << Text setzen ( neu ) ;
Wenn ( w [ Kontrollkästchen ( 2 )] << erhalten , w [ Kontrollkästchen ( 2 )] << Satz ( 1 )) ;
Wenn ( w [ Kontrollkästchen ( 6 )] << erhalten , w [ Kontrollkästchen ( 6 )] << Satz ( 1 )) ;
Wenn (( w [ Kontrollkästchen ( 7 )] << erhalten ) == 0 , w [ Kontrollkästchen ( 7 )] << Satz ( 1 )) ;
w [ Buttonbox ( 3 )] << Klicken ;
//Hauptmenü( "Alle ersetzen" );
Betreff: Tabellenweites Suchen und Ersetzen in einem SkriptVielleicht habe ich verwirrt, was David aufgrund seines Kommentars „Get Column Names“ gefragt hat.Ich hatte den Eindruck, dass er die Spaltennamen ändern möchte (nicht die tatsächlichen Zeilendaten).Auf jeden Fall ist es das, was ich versuche.Ich möchte den Namen mehrerer Spalten ändern (dh „labdata“ aus jedem Spaltennamen entfernen).Das ist es, was mein obiges Skript tun wird.In JSL dauert es bei 85.000 Spalten ca. 19 Sekunden.Der „Suchdialog“ dauert nur einen Bruchteil einer Sekunde.
Irgendwelche Ideen, wie es geht Das ohne eine For-Schleife (oder eine supereffiziente)?
Danke,
Jake
Betreff: Tabellenweites Suchen und Ersetzen in einem SkriptMit JMP 11 auf einem MacBook Pro erhalte ich „2 Sekunden für 5800 Zeilen“ oder 1,753558 Sekunden, wenn ich HP time( ) anstelle von Today( ) verwende.
Im Gegensatz zu dem, was oben behauptet wurde, ist das integrierte Suchen und Ersetzen hier viel langsamer. Die Fertigstellung des folgenden Codes dauert 16,27 Sekunden (der Code geht davon aus, dass der Suchdialog durch eine vorherige manuelle Suche „vorbereitet“ wurde).
dt = offen ( „$Sample_Data\Probe.jmp“ ) ;
start_dt = HP-Zeit () ;
Hauptmenü ( "Alles ersetzen" ) ;
end_dt = HP-Zeit () ;
drucken ( verkohlen (( end_dt - start_dt ) / 1e6 ) || „Sekunden für“ || verkohlen ( Nr ) || " Reihen" ) ;
Betreff: Tabellenweites Suchen und Ersetzen in einem SkriptHier ist ein Beispiel mit einer großen Tabelle aus dem Beispieldatensatz.Es hat nur 5800 Zeilen und dauert 8 Sekunden.JMP 11 64-Bit auf einem Lenovo T420.Es wäre interessant, verschiedene Ansätze zu vergleichen.
dt = offen ( „$Sample_Data\Probe.jmp“ ) ;
col_names = dt << Spaltennamen abrufen ( numerisch , Zeichenfolge ) ;
für ( ich = 1 , ich <= nitems ( col_names ) , ich ++,
Spalte ( dt , col_names [ ich ]) << Datentyp ( Charakter ) ;
) ;
start_dt = Heute () ;
Nr = nrows ( dt ) ;
col_names = dt << Spaltennamen abrufen ( Zeichenfolge ) ;
für ( ich = 1 , ich <= nitems ( col_names ) , ich ++,
one_col = Spalte ( dt , col_names [ ich ]) ;
für ( k = 1 , k <= Nr , k ++,
one_col [ k ] = Ersatz ( one_col [ k ] , "." , "," ) ; // Dezimalzahl durch Komma ersetzen
) ;
) ;
end_dt = Heute () ;
drucken ( verkohlen ( end_dt - start_dt ) || „Sekunden für“ || verkohlen ( Nr ) || " Reihen" ) ;
Betreff: Tabellenweites Suchen und Ersetzen in einem SkriptHallo David,
**Nachdem ich das alles abgetippt hatte, wurde mir klar, dass die ursprüngliche Frage schon vor LANGER Zeit gestellt wurde.Meine „effizientere“ Frage bleibt jedoch bestehen, ob mir dabei jemand helfen kann. **
Ich versuche, das Gleiche herauszufinden.Eine Lösung besteht darin, eine For-Schleife zu verwenden und jede Spalte einzeln durchzugehen. Dies kann jedoch je nach Datensatz viel Zeit in Anspruch nehmen.Als Referenz ist unten ein Beispielcode aufgeführt.
dt = aktuelle Datentabelle();
Für( i=1,i<=ncol(dt),i++,
Spaltenname = Column(i) << get name;
neuer Spaltenname = munger(colname,1,"replacestring",""); // Ähnliches können Sie mit dem Befehl „Substitute“ tun
Column(i) << Set Name(newcolname);
);
Kennt jemand eine effizientere Möglichkeit als eine For-Schleife, dies zu beheben?Wenn Sie beispielsweise das Standarddialogfeld „Suchen und Ersetzen“ verwenden, wird dies sehr schnell ausgeführt.Bei ca. 65.000 Spalten nimmt der For-Loop-Ansatz jedoch viel Zeit in Anspruch.
Danke,
Jake