Wie ersetze ich leere Zeilen bis zum nächsten Eintrag (und fahre fort)?Liebe JMP-Community,
(W10, 64-Bit, JMP 15.0 Pro)
Ich habe eine große Datentabelle, die aus einer Excel-Datei importiert wird, und ich benötige leere Zeilen einer Spalte, die mit den Einträgen der vorherigen Liste gefüllt sind. Ich versuche, JSL so zu schreiben, dass es von einer Spalte links zur rechten Spalte wechselt, wie unten gezeigt:

Ich denke, es sollte ziemlich einfach zu programmieren sein, aber das Problem, das ich habe, besteht darin, dass ich korrekterweise am Ende des vorherigen Produkts aufhöre und mit dem neuen Produkt beginne. Ich muss wohl nicht richtig durchgeschleift sein.
Anregungen/Hilfe sind willkommen.
Danke!,
DS
Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Ein paar der JMP-Systemingenieure beschäftigten sich intensiv mit diesem Problem und dies war die beste Lösung. Diese endgültige Version von @Brady Brady ist um ein Vielfaches schneller und robuster als die einfache Formel, mit der wir begonnen haben. Ich benutze es seit Jahren und habe festgestellt, dass es in einer Reihe von Situationen gut funktioniert. Freut mich, dass es bei dir geklappt hat!
Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Hallo @Byron_JMP ,
Vielen Dank für den Scripting-Tweak-Code in Ihrem vorherigen Beitrag. Diese ist besser als meine Lösung, weil sie prüft, ob der erste Eintrag in der Spalte fehlt, und wenn ja, ersetzt sie ihn durch den nächsten vorhandenen Eintrag, was meiner Meinung nach bei einigen von mir eingebrachten Importen vorkommt. Ich habe keine Erfahrung mit einigen der dortigen Skriptlösungen, beispielsweise damit, wie Sie die VEC- und Matrixinformationen verwenden, um nach bestimmten Dingen zu suchen. Wie auch immer, ich habe es auf mein spezifisches Problem angewendet und es hat es ohne Probleme behoben.
Danke!,
DS
Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Ich kann die JSL-Funktion oder -Nachricht, die denselben Vorgang ausführt, nicht finden. Ich glaube nicht, dass es existiert. Es gibt eine Main Menu()-Funktion, aber dieser Befehl ist mit der ausgewählten Spalte verknüpft, nicht mit dem JMP-Hauptmenü.
Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Ich kenne den JSL-Code hinter der interaktiven Lösung nicht. Das sollte in Ordnung sein, da Sie dort mehrere Optionen haben.
Ich weiß, dass die interaktive Lösung, wie einige der Skripte, auf mehrere Spalten gleichzeitig angewendet werden kann. Wählen Sie einfach alle Spalten aus, klicken Sie mit der rechten Maustaste und wählen Sie die Option „Füllen“.
Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Dies sind einige JSL-Hinweise, die Ihnen bei der Skripterstellung für die Lösung hilfreich sein werden
//better version of Fill in Missing Cells, by Brady Brady
Names Default To Here( 1 );
dt = Current Data Table();
dtcollist = dt << get column names;
dlg = Dialog( "Select Column", vlist( selection = List Box( dtcollist ), button( "OK" ) ) );
Remove From( dlg, 2 );
Eval List( dlg );
dtMat = (dt << Get All Columns As Matrix);
For( i = 1, i <= N Items( selection ), i++,
colNum = Contains( dtColList, Name Expr( selection[i] ) );
vMat = dtMat[0, colNum];
mis = Loc( Is Missing( vMat ) );
If( N Row( mis ),
col = column(selection[i]);
If( mis[1] == 1,
col[1] = col[(Loc( vMat ))[1]]
);
For( j = if(mis[1]==1, 2, 1), j <= N Row( mis ), j++,
col[mis[j]] = col[mis[j] - 1]
);
);
);
///////////////////////////// short tweak for scripting
dtcollist=dtnr<<GET column="" names=""></GET>
Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Es gibt ein wirklich fantastisches Add-In, ein Muss namens Datentabellen-Tools
Es gibt dort ein Interpolationstool, das dies und noch viel mehr erledigt. Außerdem ist es viel schneller als die Formeln auf großen Tabellen.

Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Hallo @Dan_Obermiller ,
Vielen Dank für den Hinweis. Ich habe das Muster „Fill to End“, „To Row“ oder „Fill“ gesehen, aber noch nicht.
Kennen Sie den JSL-Code, der das macht? Der Grund, warum ich frage, ist, dass ich das alles im JSL-Code haben möchte, weil ich mehrere Dateien einlese, um eine große Datentabelle zu erstellen, und den Prozess automatisieren muss, damit der Endbenutzer einfach das Skript ausführt und seine Tabelle ohne fehlende Werte für herauskommt das Produkt. Wenn es schneller und eleganter ist als meine Lösung, würde ich den Code gerne ändern und in mein Skript einfügen.
Danke!,
DS
Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Sie haben ein Skript, das die Aufgabe erledigt, aber es gibt auch eine interaktive Lösung. Wählen Sie die Spalte aus, die ersetzt werden muss, sodass alle Zeilen ausgewählt sind. Klicken Sie mit der rechten Maustaste in das Datenraster dieser Spalte und wählen Sie „Füllen“ > „Fehlenden durch vorherigen Wert ersetzen“.

Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Hallo @Thierry_S ,
Ihre Formel würde wahrscheinlich funktionieren, aber ich konnte sie mit der speziellen Tabelle, die ich habe, nicht optimal zum Laufen bringen. Ein Problem, das ich festgestellt habe, ist, dass ich manchmal mehrere Zeilen hintereinander habe, in denen sich das Produkt ändert, und die Verzögerung nicht funktioniert.
Ich habe mir diesen Code ausgedacht, der perfekt funktioniert. Es ist nicht sehr elegant, aber es funktioniert!
Vielen Dank für Ihre Hilfe!,
DS
RowReplace = dt << Get Rows Where( :Product != "" );
RowEnd = RowReplace;
Remove From( RowEnd, RowEnd[1] );
Insert Into( RowEnd, N Rows( dt ) );
For( l = 1, l <= N Items( RowReplace ), l++,
For( irow = 2, irow <= RowEnd[l], irow++,
If( Is Missing( :Product[irow] ) == 1,
:Product[irow] = :Product[RowReplace[l]],
)
)
);
Betreff: Wie kann ich leere Zeilen bis zum nächsten Eintrag ersetzen (und fortfahren)?Hallo, hier ist eine einfache Formel für den Trick
If( Is Missing( :Column 1 ),
Lag( :Column 2, 1 ),
:Column 1
)
Am besten,
TS