Liebe JMP-Community,
Ich habe die Aufgabe, ein Skript zu schreiben, das den Import von Daten aus „unordentlichen“ Excel-Dateien automatisieren soll. Ich sage „chaotisch“, weil die eigentlichen Daten, die ich aus den Excel-Dateien extrahieren möchte, nicht in ordentlichen Spalten und Zeilen organisiert sind – sie sind überall verteilt –, aber sie befinden sich immer an der gleichen Stelle in jeder Excel-Datei. Die Dateien enthalten im Wesentlichen Chargeninformationen zu unseren Produktionschargen und ich versuche, die Testdaten aus diesen Excel-Dateien abzurufen und in eine JMP-Datentabelle einzufügen.
Es gibt mehrere Chargen-Excel-Dateien, die über mehrere Verzeichnisse verteilt sind. Um das zu beheben, erstelle ich mit dem Befehl „Files In Directory()“ eine Liste aller Excel-Dateien, die ich öffnen muss, mit dem Flag „rekursiv“, damit ich beim Erstellen der Liste auch alle Unterverzeichnisse ergreife. Dadurch entsteht eine Liste mit mehreren hundert Einträgen. Rufen Sie die Liste NLotFiles auf.
Ich habe zuerst eine For-Schleife, die von i=1 bis N Items(NLotFiles) lang läuft, also muss sie diese größere For-Schleife ein paar hundert Mal durchlaufen.
Dann muss ich die Datei MEHRMALS öffnen und jedes Mal einige Informationen importieren. Ich muss dies mehrmals tun, da die Informationen nicht nur über mehrere Zellen, sondern auch über mehrere Registerkarten in der Excel-Datei verteilt sind.
Beim ersten Öffnen werden das Datum und die Chargeninformationen abgerufen. Ich muss dann prüfen, ob in der ersten Spalte, der ersten Zeile ein Eintrag vorhanden ist (sofern ein Datum vorhanden ist). Wenn nicht, möchte ich diese Datentabelle schließen und zur ersten For-Schleife zurückkehren, um mit der nächsten Iteration fortzufahren.
****Hier stecke ich fest.
Beim nächsten mehrfachen Öffnen werden alle Daten in andere Tabellen übertragen, die ich dann zusammenfüge und zu einer großen Datentabelle zusammenfüge. Solange in jeder Datei ein Eintrag für das Datum vorhanden ist, funktioniert diese Methode. Allerdings haben nicht alle Dateien ein Datum – z. B. wurde an diesem Tag kein Los erstellt. Wenn das passiert, wird die Datei trotzdem geöffnet, aber der Rest des Codes funktioniert nicht richtig, da er auf der Struktur der Excel-Datei und dem Vorhandensein des Datums basiert.
Da es in JSL keine GOTO-Option gibt, fällt es mir schwer, den Datumswert zu testen und die Tabelle zu schließen, wenn keiner vorhanden ist, und zur nächsten Iteration in der NLotFiles-Liste zurückzukehren. Ich teste die Existenz eines Datums, indem ich die Funktion Is Missing() verwende und versuche, Continue() zu verwenden, aber es funktioniert nicht so, wie ich es mir vorgestellt habe.
Die Grundstruktur dieses Codes sieht etwa so aus:
For( i= 1, i<=N Items( NLotFiles ), i++,
Open(
DataPath || "\"|| DataFiles[i],
Worksheets( "Coversheet" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 2 ),
Data Starts on Row( 3 ),
Data Starts on Column( 3 ),
Data Ends on Row( 3 ),
Data Ends on Column( 5 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
//This part tests if the date (first column, first row) is empty.
If(Is Missing(Column(Current Data Table(),1)[1])==1,
Close(Current Data Table(), no save),
Continue()
);
/////*****HERE IS WHERE I WANT IT TO GO BACK TO THE TOP IF NO DATE IS PRESENT BUT CONTINUE DOWN BELOW IF A DATE IS PRESENT*****
/////I don't think the Continue() is in the right place, but then if I don't have it present, the code just stops because all the stuff below can't be done.<BR /><BR /><BR />//This part ensures the date is Numeric and Continuous
datedt = Current Data Table();
datedt:Date << Data Type( Numeric, Format( "m/d/y" ) ) << Modeling Type( "Continuous" );
//Next steps would bring in the data from different tabs as the date information (again, I have to do multiple opens on the same file.)
//Then join all the data, clean things up in the new data tables<BR /><BR />); //This last ");" closes the big For loop that runs through a total of NLotFiles times.<BR /><BR />//Then I concatenate the multiple tables (each table represents a lot now) into my final data table and close all unwanted tables.Es wäre toll, wenn ich JMP mitteilen könnte, welche Tabulatoren und Zellen genau importiert werden sollen, etwa mithilfe einer Liste von Tabulator- und Zellennummern, da diese in den Excel-Dateien immer dieselben sind. Dadurch würde die mehrfache Schleife entfallen, die erforderlich ist, um alles einzubringen.
Jede Hilfe wird sehr geschätzt, insbesondere wenn jemand eine bessere Vorstellung davon hat, wie man die wichtigen Informationen herausholt und den Code einfacher/einfacher macht, als er derzeit ist. Der tatsächliche Code, den ich habe, umfasst insgesamt etwa 300 Zeilen (einschließlich Leerzeilen), also ist er nicht so schlecht. Aber einfacherer Code lässt sich oft einfacher beheben oder auch von jemand anderem programmieren.
Danke!,
DS
Hallo @gzmorgan0 ,
Vielen Dank für Ihr Feedback. Ich glaube, ich hatte es versucht und es hat immer noch nicht funktioniert. Das Problem war nicht so sehr der „Kleber“ als vielmehr die große äußere For-Schleife, die nach dem Beenden des „If(Is Missing…“-Teils) weiterläuft und aufgrund der Datentabelle nicht weiß, was an späteren Stellen im Code zu tun ist geöffnet worden wäre, existiert nicht mehr.
Ich habe gestern gerade einen Workaround gefunden, den ich heute Morgen getestet habe, und er funktioniert perfekt. Es lief genau so, wie ich es mir vorgestellt hatte.
Ich habe festgestellt, dass, wenn ich „Leere Spalten unterdrücken (1)“ (die Standardeinstellung beim Öffnen von Excel-Dateien) in „Leere Spalten unterdrücken (0)“ ändere, eine leere Datentabelle geöffnet wird, in der ich das Datum festlegen kann 1.1.1904 (also 0), dann, nachdem ich die Big-Data-Tabelle aus den mehreren hundert Dateien erstellt hatte, suchte ich nach allen Zeilen mit Datum=0 und löschte sie einfach.
Es ist vielleicht nicht die eleganteste Lösung, aber da JSL keine GoTo-Option hat, ist dies das Beste, was ich tun konnte – zumindest das, wozu ich in der Lage bin. Es entstehen also eine Menge leerer Einträge, nach denen man aber leicht suchen kann, anstatt eine Tabelle mitten in der for-Schleife zu schließen.
Danke!,
DS
@SDF1 ,
Ich habe Ihr beschriebenes Problem noch nicht vollständig verstanden, habe jedoch einen Fehler in Ihrem Code entdeckt, der Ihnen vielleicht einen Fortschritt bringen könnte.
Ihr JSL:
//This part tests if the date (first column, first row) is empty.
If(Is Missing(Column(Current Data Table(),1)[1])==1,
Close(Current Data Table(), no save),
Continue()
);
Der Fehler ist das Komma nach dem Schließen. Ich denke, Sie möchten schließen UND fortfahren. Die Kommas sollten ein Semikolon sein. Das Semikolon dient als Bindeglied für jeden JSL-Befehl/jede JSL-Aktion, die Sie ausführen möchten, dh es definiert den auszuführenden Codeblock.
Ersetzen Sie es durch Folgendes und Ihr Continue() sollte funktionieren:
//This part tests if the date (first column, first row) is empty.
If(Is Missing(Column(Current Data Table(),1)[1])==1,
Close(Current Data Table(), no save);
Continue()
);