Adam,
Ich bin mir nicht sicher, ob dies zu Ihrem Szenario passt, aber ich hatte vor ein paar Jahren ein ähnliches Problem.Auf einem Dateiserver wurde jeden Tag ein neues Verzeichnis erstellt, und dieser Ordner enthielt die Dateien für diesen Tag. Das Problem war, dass die Zeit nicht konsistent war. Die Zeit des Ordner- (Verzeichnis-) Namens war die Datumszeit, zu der die erste Datei für diesen Tag eintraf. Daher war die genaue Zeit nicht bekannt.
Der einfachste JSL-Befehl war zu verwenden Ordner = Dateien im Verzeichnis ("Pfad") und verwenden Sie keine Rekursion. Verwenden Sie dann JSL, um den Ordner zu durchsuchen, der mit dem heutigen Datum begann oder dieses enthielt.Das funktionierte perfekt, aber der Server hatte "Bazillionen" von Ordnern und die Leistung war ziemlich langsam.Ich arbeite mit einem Windows-Betriebssystem, also habe ich Run Program mit cmd.exe verwendet, um einen benutzerdefinierten dir-Befehl auszuführen. Zum Beispiel dieser MS Dir-Befehl
dir /a:d /o:-dc:\temp\jsl*
würde alle Ordner (/a:d alle Verzeichnisse) zurückgeben, die vom neuesten bis zum ältesten (/o:-d Reihenfolge umgekehrtes Datum) aufgelistet sind, die in meinem c:\temp-Verzeichnis vorhanden sind, dessen Ordnername mit jsl beginnt. So könnte ich das Datum des aktuellen Tages verwenden, um die Liste einzugrenzen.
Für mein „Bazillion“-Ordnerproblem war die Verzeichnisnamenstruktur, nach der ich suchen musste, etwa 20180524*something_somethingelse. Da es Zeiten gab, in denen ein Backup den Ordneraufbau neu startete, erhielt ich manchmal 2 und sehr selten 3 Werte in meiner Liste. Da es sich jedoch um eine umgekehrte Reihenfolge handelt, war das erste Element in meiner Liste der Zielordner.
In meinem Skript würde ich, sobald ich den Zielordner erhalten habe, Files In Directory () verwenden, jetzt, wo ich das Verzeichnis mit der spezifischen, unbekannten, variierenden Zeit hatte, und jede Datei verarbeiten und einen Bericht erstellen, alles remote (in Batch ).
Wenn Sie einen Mac verwenden, kann ich nur Jims Vorschlag anbieten, der großartig ist. Suchen Sie für jede Datei in der von Files inDirectory() zurückgegebenen Liste nach denen, die das heutige Datum enthalten, und wenn es mehr als eine gibt, erhalten Sie das Erstellungsdatum und finden Sie die neueste.
Wenn Sie Windows verwenden und ein Leistungsproblem haben, finden Sie hier ein Skript, das zeigt, wie Sie alle Ordner in Ihrem JMP-Installationsverzeichnis abrufen.[Beachten Sie, dass für etwas so Einfaches wie dieses Beispiel Files in Directory() die beste Lösung ist.]
// Get the full path for the JMP Install Directory
jmpDir = Convert File Path( "$JMP_Home", Windows );
Show( jmpDir );
// Build the DOS "dir" command
// dir /-C /T:C /S "C:\Program Files\SAS\JMPPRO\13\Samples\Data\*.J*" > c:\temp\dirOut_rp.txt
// --- DOS requires quoted file paths if the path includes spaces Program Files has a space
//this has no output file and /b only the directory name is returned
cmd_txt ="\[/c dir /a:d /b /-c /o:-d "]\"
|| jmpDir //will replace it with the full path of your installed JMP directory
||"\[* ]\";
show(cmd_txt ); //see the log file
//results returned as text
rpobj = RunProgram(Executable("CMD.EXE" ),
Options({Eval(cmd_txt)}),
ReadFunction("text")
);
show(rpobj);
if(length(rpobj) >0, dirList= words(rpobj,"\!N") );
show(dirList);
/*
{"ExcelProfiler", "imagemaps", "Tip of the Day", "Help", "Resources", "pptx",
"Flash", "Documentation", "tkext", "Scoring", "Samples", "Web", "Maps"}
*/
//____________________________________________________________________________________________
//alternate command to return information to a file
outDir = "c:\temp\dirOut_rp.txt";
cmd_txt ="\[/c dir /a:d /b /-c /o:-d "]\"
|| jmpDir //will replace it with the full path of your installed Sample Data directory
|| "\[*" > ]\"
|| outDir;
show(cmd_txt ); //see the log file
t0 = Today();
rpobj = RunProgram(Executable("CMD.EXE" ),
Options({Eval(cmd_txt)}),
ReadFunction("text")
);
//--- ReadFunction is reading statements from the OS, it reads until the program quits.
// This command suspends subsequent JSL until executable has completed the tasks.
//==== Show results=============================================================================
// A couple of "checks" that you may employ here if the file does not does not exist or if it is older than expected
If( !File Exists( outDir ) | (Creation Date( outDir ) - t0 > 10),
Caption( "There was a problem with the dir command, it did not run. Aborting..." );
Wait( 4 );
Caption( Remove );
Throw();
);
// Open the results file as text stored in column 1
dir_dt = Open(
outDir,
columns( Name( "Dir results" ) = Character ),
Import Settings(
End Of Line( CRLF ),
End Of Field( CRLF ), // ensures only 1 column
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 1 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
Labels( 0 ),
Data Starts( 1 ),
Lines To Read( All ),
Year Rule( "10-90" )
)
);
Sie haben nicht angegeben, wie Sie angeben würden, aus welchem Verzeichnis die Dateien abgerufen werden sollen, also habe ich nur Pick Directory () verwendet.Ich gehe davon aus, dass Sie nur einen Standardordner haben, in den Sie wechseln können, und in diesem Fall können Sie Pick Directory () einfach umgehen mit:
folder = "<YOUR folder="" path="">";</YOUR>
Jim,
Vielen Dank für Ihre Hilfe,
Ich kenne die Funktion zum Auswählen des Verzeichnisses nicht. Kann sie ohne Eingabeaufforderung ausgeführt werden? Mein Skript sollte täglich im Hintergrund ohne Benutzerbeteiligung laufen
Danke
Hier ist ein einfaches Skript, von dem ich denke, dass es Ihnen eine Vorstellung davon gibt, wie Sie herausfinden können, welche Datei(en) Ihren Anforderungen entsprechen
Names Default To Here( 1 );
folder = Pick Directory();
// Get all of the files in the folder
FileList = Files In Directory( folder );
// Create the known part of the files to look for
Header = Char( Day( Today() ) ) || "_" || Char( Month( Today() ) ) || "_" ||
Char( Year( Today() ) - 2000 ) || "_";
// Loop through the found files and eliminate all that do not
// match the pattern we are looking for
For( i = N Items( FileList ), i >= 1, i--,
If( Left( FileList, Length( Header ) ) != Header,
FileList = Remove( FileList, i, 1 )
)
);