【问题标题】:How to stop the error of "fielref is still in use"如何停止“fielref is still in use”的错误
【发布时间】:2015-12-24 14:05:23
【问题描述】:

我有这个网络爬虫代码,它从网站源代码中获取某些信息。它运行一个宏,然后再调用 2 个宏。第一次访问这些宏时,会发生错误。 “至少一个与 filref 关联的文件仍在使用中” 下面是它运行的示例代码。让我知道是否需要更清楚。

%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;

【问题讨论】:

  • 最后一个 %let 上方有一个奇怪的注释。而且我不知道,但是您在 if 下方缺少运行语句。
  • 不是完整的代码。当它尝试访问 %do 循环时,就会出现错误。我每次都需要关闭、删除、停止文件引用。
  • 那么是 %showpage1 和/或 %showpage2 中的代码抛出错误吗?如果是这样,这些宏是什么样的?
  • 添加了显示页面信息。感谢您的所有快速回复。
  • 你试过把filename _next clear;放在%showpage的末尾吗?这可能会解决问题。

标签: sql macros sas


【解决方案1】:

您可能需要弄清楚 SAS 认为该文件仍在使用中的原因,但有几种方法可以修改您的程序,这可能会使问题消失。

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

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

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

...
run;
filename _n&sysindex clear ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2020-07-22
    • 2019-12-18
    • 2012-01-18
    • 1970-01-01
    • 2013-07-25
    • 2017-07-18
    相关资源
    最近更新 更多