计算宏变量中的单词数量

时间:2015-10-22 04:11:23

标签: sas

我需要从excel导入多张表。

我目前正在做的是

%let _path = C:\;
%let _name = AOL.xlsx;
%let sheet_list  = AG ST;    

%macro Import;
   %local current_sheet;    
   %do i = 1 %to %sysfunc(countw(&sheet_list.)); 
      %let current_sheet = %scan(&sheet_list., &i);    
      proc import out=SQ_&current_sheet. replace datafile="&path.\&_name.";
         sheet="&current_sheet.";
      run;
   %end;    
%mend Import;    
%Import;

但是其他一些表的名字包含空格。

%let sheet_list = AG 11, AG 12, ST;

如何调整上述代码以满足这种情况?

4 个答案:

答案 0 :(得分:2)

只需将其他参数用于COUNTW()%SCAN()函数,以便设置分隔符。我不会使用逗号作为分隔符,因为它需要宏引用才能在函数调用中使用它。使用类似于工作表名称的无效字符|之类的内容。

%let _path = C:\;
%let _name = AOL.xlsx;
%let sheet_list  = AG 11|AG 12|ST;

%macro Import;
%local i current_sheet;
%do i = 1 %to %sysfunc(countw(&sheet_list,|)); 
  %let current_sheet = %scan(&sheet_list., &i, |);
  proc import out=SQ_&current_sheet. replace datafile="&path.\&_name.";
     sheet="&current_sheet.";
  run;
%end;
%mend Import;

%Import;

实际上,当尝试将工作表名称用作SAS数据集名称的一部分时,工作表名称中的空格也会造成问题。您可以用下划线替换空格。

...
%local i current_sheet member_name;
...
  %let member_name = %sysfunc(translate(SQ_&current_sheet,_,%str( )));
  proc import out=&member_name replace datafile="&_path.\&_name.";
...

答案 1 :(得分:1)

如果您的工作表列表以逗号分隔,则只需计算:

a)逗号+ 1(对于单词)

b)直接用逗号作为分隔符的单词数

if self.request.method == 'POST' and request.is_ajax:

答案 2 :(得分:0)

你真的需要数字吗?好像你只想要像

这样的东西
output <- data.frame(...) # declare the appropriate dataframe
     for (files in folder)
         for (i in loop2)
               for (j in loop3)
                    res <- ... # compute some result
                    name <- ... # compute some name for the current row
                    output <-  rbind(output,res)  # Fill the data frame...
                    rownames(output)[nrow(output)]<-rowname # ... with a specific row name

但SAS在MACRO语言中没有这种语法,所以你必须自己编写。您还需要能够指定单词分隔符。

FOR word IN list DO import END

答案 3 :(得分:0)

根据您的代码,可以在修改后使用。

%let sheet_list =%str(AG 11, AG 12, ST);

%macro Import;
%local current_sheet;

%do i = 1 %to %sysfunc(countw(&sheet_list,%str(,))); 
    %let current_sheet = %scan(&sheet_list., &i,%str(,));

    proc import out=SQ_&current_sheet. replace datafile="&path.\&_name.";
         sheet="&current_sheet.";
    run;
%end;

%mend Import;

%Import;