2017-08-03 1 views
0

ich den folgenden Code ausgeführt wurde:ERROR: Keine logische assign für Dateinamen FNAME

%LET TIME_INTERVAL='MINUTE15'; 
/* 
* Get the file names of a specific location 
*/ 
%MACRO get_filenames(location,filenames); 
filename _dir_ "%bquote(&location.)"; 
data &filenames(keep=fname); 
    handle=dopen('_dir_'); 
    if handle > 0 then do; 
    count=dnum(handle); 
    do i=1 to count; 
     fname=dread(handle,i); 
     output &filenames; 
    end; 
    end; 
    rc=dclose(handle); 
run; 
filename _dir_ clear; 
%MEND; 

%MACRO NBBO (fname); 
DATA TICKERS_NBBO; 
    INFILE &fname; 
    INPUT SYMBOL $; 
RUN; 
%mend; 

%MACRO CALCU(DATE_VAR); 
%get_filenames('./groups',filenames); 
data _null_; 
    set filenames; 
    by fname; 
    if fname =: "&TIME_INTERVAL"; 
    %NBBO(fname); 
run; 
%mend; 

aber ich habe den Fehler: ERROR: No logical assign for filename FNAME.

Ich frage mich, was ist der Grund dafür, dass dies verursacht?

Es gibt viele csv-Dateien im Ordner groups. Ich habe versucht, den NBBO-Makro auf jeder der Dateien auszuführen und jede Datei in einen Datensatz mit infile-Anweisung zu laden.

Antwort

1

Sie mischen Datenschrittcode und Makrocode in einer Weise, die nicht zulässig ist. Sie können den Inhalt der Variablen fname nicht extrahieren und damit eine Makrovariable auffüllen. Stattdessen übergeben Sie den Text fname an diese Makrovariable, die dann nicht funktioniert.

Sie können auf diese Weise auch keinen weiteren Datenschritt innerhalb eines Datenschritts ausführen. Sie müssen eine der verschiedenen Methoden verwenden, um sie nach dem Beenden des Datenschritts oder während der Ausführung auszuführen.

Schließlich ist es mir völlig unklar, was Sie wirklich hier tun: weil Sie mit nur einer dieser Dateien im Dataset enden werden.

Ich denke, Sie möchten vielleicht etwas wie das, was viel einfacher ist. Ich verwende die FILEVAR Option in infile, die den Wert einer Variablen verwendet; Ich muss einige Änderungen an der Berechnung von fname vornehmen (ich denke, Sie müssen dies trotzdem tun, es enthält keinen Verzeichnisnamen).

%MACRO get_filenames(location,filenames); 
filename _dir_ "%bquote(&location.)"; 
data &filenames(keep=fname); 
    length fname $512; 
    handle=dopen('_dir_'); 
    if handle > 0 then do; 
    count=dnum(handle); 
    do i=1 to count; 
     fname=catx('\',"%bquote(&location.)",dread(handle,i)); 
     output &filenames; 
    end; 
    end; 
    rc=dclose(handle); 
run; 
filename _dir_ clear; 
%MEND; 

%get_filenames(location=c:\temp\cars, filenames=fnam); 

data tickers_nbbo; 
    set fnam; 
    infile a filevar=fname dlm=','; 
    input symbol $; 
run; 

Wenn Sie wirklich separat einen Daten Schritt brauchen anrufen, müssen Sie entweder CALL EXECUTE, verwenden DOSUBL oder konstruieren Makro Anrufe auf eine andere Weise (PROC SQL SELECT INTO, %INCLUDE, etc.).

+0

Ist es mir möglich, Makro NBBO auf jeder der Dateien in den Dateinamen aufzurufen? –

+0

Zum Beispiel 'call execute (cats ('% nrstr (% NBBO) (', fname, '') '));' –

+0

Ja, es ist möglich (das ist die Art, wie Sie Call Execute verwenden würden, mehr oder weniger). Es wird nicht das tun, was Sie im obigen Beispiel wollen, aber mein Beispiel ist, was Sie wollen, ich bin mir ziemlich sicher (es sei denn, Ihr Beispiel ist nicht repräsentativ). – Joe

Verwandte Themen