如何停止 "fielref is still in use" 的错误

How to stop the error of "fielref is still in use"

我有这个网络抓取代码,它从网站源代码中获取某些信息。它运行一个宏,然后再调用 2 个宏。第一次访问这些宏时,会发生错误。 "At least one file associated with filref is still in use" 下面是它运行的示例代码。让我知道是否需要更清楚的内容。

%macro webcrawl(search_url);
    %let url3 =  &search_url;
    filename _next3 url  "&url3";

    data search_website;
        infile _next3 length = len lrecl = 32767;
        input text $varying32767. len;
        if index(text,'<header>') or index(text, '<p>');
    run;

    proc sql;
        create table table1 as
        select distinct var1
        from table;
    quit;


    /* Calls the macro from above to "crawl" the website 
    %do i=1 %to &show_count;
        %showpage1( &i, &&var_&i, http://www.website.com );
        %showpage2( &i, &&var_&i, http://www.website.com/2 );
    %end;

下面是showpage1的代码,showpage2也是一样的,只是网站不同而已。

%macro showpage1( index, show, url );
    %let url1 = &url;
    filename _next url "&url";

    data search_website;
        infile _next length = len lrecl = 32767;
        input text $varying32767. len;    
        if index(text, '<span>') or index(text, '</span>');
        retain i;    
        if index(text, '<h2 class="title"') then i+1;
    run;

    data counting;
        set search_website;
        by i;    
        if first.i then count = 0;
        count+1;
    run;

    proc transpose data=counting out=search_one_line prefix=info;
        by i;
        id count;
        var text;
    run;

    data info1_&i (keep=var1 var 2 var3);
        set dataset1;
    run;

    options missing=0;

%mend showpage1;

您可能需要弄清楚为什么 SAS 认为该文件仍在使用中,但是有几种方法可以修改您的程序来解决问题。

您可以在每次运行宏时使用不同的文件引用。您可以为此使用 SYSINDEX 自动变量,因为它计算宏调用的次数。

filename _n&sysindex url "&url";
...
infile _n&sysindex length = len lrecl = 32767;

还要确保在数据步骤完成后清除 fileref。

...
run;
filename _n&sysindex clear ;