Nach stundenlanger Suche im Internet scheint es keine klare Antwort darauf zu geben, wie ich das erreichen kann, was ich tun möchte, und nach einer Reihe von Codierungsversuchen ist dies eindeutig einer der Bereiche, in denen sich JSL dramatisch von anderen Programmiersprachen unterscheidet. Ich habe CSV-Dateien, die als Datenbanken in einem benutzerdefinierten VBA-Programm für einen Client verwendet werden. Der Grund für die Verwendung von CSV-Dateien lag hauptsächlich darin, dass es einfacher war, die Datenbank in JMP zu importieren, um regelmäßige Analysen durchzuführen, ohne eine spezielle Exportfunktion erstellen zu müssen, wie dies bei der vorherigen Version des benutzerdefinierten Tools erforderlich war. Ich erstelle ein Skript zum Importieren der Datenbankdatei und führe einige vorbereitende Vorbereitungen durch, damit in der Datentabelle alles vorhanden ist, damit Leistungsanalysen durchgeführt werden können. Das meiste davon ist ziemlich routinemäßig und wurde bisher in meinem JSL-Skript durchgeführt.
Das Problem, das ich jetzt habe, ist, dass ich an mehreren Stellen Nullwerte habe, an denen eigentlich Werte fehlen sollten. Die Nullen resultierten aus dem Export der Daten aus Excel mithilfe eines Datenobjekts in VBA.Die Daten in der Datenbankdatei befinden sich niemals auf einem Arbeitsblatt, da das benutzerdefinierte Excel-Tool vollständig GUI-basiert ist. Daher haben die tatsächlich fehlenden Daten in den Eigenschaften, aus denen das Datenobjekt im Code besteht, den Standardwert 0; In VBA gibt es kein Äquivalent zu fehlenden Daten für numerische Datentypen.
Daher möchte ich die Nullen in bestimmten Spalten durch fehlende Werte ersetzen, die auf Flags in anderen Spalten basieren. Wenn beispielsweise die Spalte „Daten zu abgebrochenen Lesevorgängen“ in einer bestimmten Zeile „Falsch“ enthält, sollten in allen Spalten, die mit einer Umfrage zu abgebrochenen Lesevorgängen für diese Zeile verknüpft sind, Werte fehlen, da für diese bestimmte Zeile keine Umfrage zu abgebrochenen Lesevorgängen durchgeführt wurde aufzeichnen. Wenn der Wert der Spalte „Umfrage abgebrochen“ „Wahr“ ist, sollten in ähnlicher Weise alle Umfragedatenspalten in dieser Zeile fehlende Werte enthalten, da für diesen Datensatz keine Umfrage jeglicher Art durchgeführt wurde. Wenn die Nullen vorhanden sind, werden verschiedene Statistiken verzerrt, da JMP Datensätze in die Analyse einbezieht, die ignoriert werden sollten.
Ich habe zwei verschiedene Methoden ausprobiert, ohne Erfolg. Die erste bestand darin, eine Bedingung zu verwenden und die Spalten zu durchlaufen:
// set canceled data to missing if canceled survey was not performed
If(:Canceled Reads Data == "True",
{
For(i = vehiclePackageColumn, i < expiredReadsColumn, i++,
Column(i) = .
)
}
);Ein Teil des Problems scheint hier darin zu liegen, dass die Spaltenverweise – „vehiclePackageColumn“ und „expiredReadsColumn“ – keine Spaltennummern sind, da die Verwendung von „vehiclePackageColumn = Column("Vehicle Packages") nicht die Spaltennummer für die Spalte „Vehicle Packages“ zurückgibt. Tatsächlich konnte ich keine Informationen darüber finden, wie der Spaltenindex (Nummer) für Spalten mithilfe von JSL erfasst werden kann.
Die zweite Methode basierte auf etwas, das ich in einem anderen Forum gesehen habe:
cancelSurveyStatus = Column(inboundDataTable, "Canceled Reads Data") << Get Values;
dataMissing[Loc(canceledSurveyStatus == "False")] = .;
Column(inboundDataTable, "Canceled Reads") << Set Values(dataMissing);
Jede Hilfe dabei wäre sehr dankbar.
Ich habe es versucht. Funktioniert super. Nochmals vielen Dank, JIm.
Das ist ganz einfach:
colnames = dt << Spaltennamen abrufen(string);
startindex = enthält(colnames, „Der Name Ihrer Startspalte“);
endindex = enthält(colnames, „Der Name Ihrer Endspalte“);
Ja!
Das schien das Hauptproblem zu lösen, fehlende Werte in eine Reihe von Spalten zu bekommen, basierend auf dem Status der Flags in bestimmten Spalten, Jim. Das einzige verbleibende Problem besteht also darin, ob es eine Möglichkeit gibt, Spaltenindizes zu erfassen. Meine Datentabelle ist ziemlich groß und das manuelle Zählen der Spalten, wie ich es bei meinem Test Ihres vorgeschlagenen Codes getan habe, ist mühsam und fehleranfällig. Diese spezielle Datentabelle hat 73 Spalten.Das Fehlen einer Möglichkeit, die Spaltenanzahl benannter Spalten in JSL zu bestimmen, ist ein schwerwiegendes Versäumnis, und sei es nur für Vorgänge wie diesen.
Ich würde denken, dass das funktionieren würde:
dt = aktuelle Datentabelle();
For( i = Ihre Startspaltennummer, i <= Ihre Endspaltennummer, i++,
Column( dt, i ) [ dt << get rows where( :Canceled Reads Data == "True")] = .;
);