Verwenden von SAS-Makro, um eine Liste von Dateinamen aus einem Windows-Verzeichnis zu pipen

7

Ich versuche, das Makro unten zu ändern, um einen Makroparameter als das 'location' Argument für einen Befehl dir zu akzeptieren. Ich kann jedoch nicht erreichen, dass es aufgrund des Problems mit verschachtelten Anführungszeichen korrekt aufgelöst wird. Die Verwendung von% str (% ') funktioniert nicht, auch keine Quoting-Funktionen aus irgendeinem Grund.

Das Makro funktioniert einwandfrei, wenn der Dateipfad keine Leerzeichen hat (z. B. C: \ temp \ withnospace), da die mittleren Anführungszeichen nicht benötigt werden. Ich brauche dieses Makro jedoch für Dateipfade mit Leerzeichen (z. B. "C: \ temp \ with space \").

Bitte helfen Sie!

%Vor%     
Allan Bowe 11.09.2009, 07:49
quelle

8 Antworten

14

Hier ist ein anderer Weg, um das gleiche Ergebnis zu erzielen, ohne eine PIPE verwenden zu müssen.

%Vor%     
cmjohns 11.09.2009, 19:53
quelle
6

Nehmen Sie die folgenden Änderungen vor und Ihr Code wird funktionieren.

%Vor%

(1) Beende die %macro -Anweisung mit einem Semikolon;

(2) Umgeben Sie die Auflösung der Makrovariablen mit doppelten Anführungszeichen und %unquote ;

(3) Geben Sie den Dateigriff frei, indem Sie ihn löschen. und

(4) Zitieren Sie nicht Ihren Eingabeparameter. Makro Zitat, wenn nötig.

    
Chang Chung 11.09.2009 20:23
quelle
3

Basierend auf dem letzten Beispiel auf dieser Seite , Versuchen Sie anstelle der Dateinamenanweisung

%Vor%

und rufen Sie das Makro ohne Anführungszeichen auf:

%Vor%

Ich habe auch versucht, Makros zu zitieren, aber ich konnte es nicht zum Laufen bringen.

    
Ville Koskinen 11.09.2009 13:35
quelle
3

Hier ist ein schnelles Makro, um Windows-basierte Verzeichnislisten in eine sas-Datei zu laden.

%Vor%

und so werden sie genannt

%Vor%

Beachten Sie, dass beim Angeben des Basisverzeichnisses kein umgekehrter Schrägstrich vorhanden ist. C: nicht C:\ .

    
rkoopmann 14.09.2009 19:56
quelle
2

es funktioniert für mich, wenn ich das Original-Makro auf diese Weise aufrufen

%Vor%

natürlich musste ich das Semikolon am Ende der %macro -Anweisung hinzufügen.

Wenn Ihr Verzeichnis ein Komma enthält, passieren schlimme Dinge. zu beheben, verwenden Sie das Makro %str()

%Vor%     
rkoopmann 11.09.2009 15:26
quelle
2

Hier ist eine reine Makrocodeversion. Sie können auch angeben, dass Sie nur über Dateien (und nicht über Ordner) informiert werden möchten und einen Basisfilter angeben können. Es gibt die Liste der Dateien in einem begrenzten Format zurück, aber Sie können diese einfach mit SQL-Einfügung in ein Dataset einfügen, wenn Sie möchten (Beispiel enthalten, aber nicht getestet - kein SAS-Zugriff atm). Es kann von überall aufgerufen werden - innerhalb eines anderen Makros, eines Datasets, einer SQL-Anweisung ... wo auch immer. Fügen Sie einfach diese beiden Makros zu Ihrer Makro-Autocall-Bibliothek hinzu und Sie haben recht damit.

Es gibt 2 Makros unten. Das Makro% isdir wird vom Makro% file_list benötigt. Die Makros sind ein bisschen größer und komplexer als die oben genannten, aber sie sind viel flexibler. Außerdem bieten sie eine Fehlerprüfung.

%Vor%     
Robert Penridge 18.04.2010 02:52
quelle
2

Hier ist einer, der die Reihenfolge des Zitierens und des Nichtquittierens entschlüsselt:

%Vor%

wobei die Makrovariable basedir Leerzeichen enthalten kann und auch die Dateinamen. Diese Kombination von %unquote und %str(%') ist ein häufig vorkommendes Makro-Idiom.

"Was ist, wenn ich ein einzelnes Zitat in meinem Verzeichnis habe?"

Die Handhabung dieser Situation erfordert eine Makro-Quotierungsfunktion, z. B. %bquote(); . Fahren Sie mit dem obigen Beispiel fort:

%Vor%

sollte es tun.

Um unendliche Wiederholungen dieser Art von Frage zu vermeiden, schauen Sie sich an Ian Whitlocks Arbeit A Serious Look on Macro Quoting, die hier zur Verfügung steht;

Es gibt (viele) andere, aber das ist das am meisten zitierte. Eine kleine Anmerkung: irgendetwas von Ian Whitlock ist wahrscheinlich lohnenswert. Er schreibt klar und sein Verständnis von SAS-Themen ist großartig.

    
Jonathan Goldberg 15.03.2010 18:35
quelle
1

Wir benutzen dieses kleine Makro

%Vor%

Beispiel Anruf

%Vor%

Wenn Sie im Stapelbetrieb arbeiten und nicht option noxwait xsync haben, bleibt der Job auf dem Server hängen und wartet auf eine Antwort des Bedieners.

    
CTKeane 11.09.2009 13:15
quelle

Tags und Links