首页 > 解决方案 > SAS 宏循环通过 proc 导入读取 csv 文件

问题描述

我有一个 csv 文件目录,每个文件的名称都以字母 m 开头,以数字结尾。有十二个文件 - m6 到 m17。

我想阅读它们并将它们作为单独的数据集进行处理。我写了两个宏试图这样做。宏 1 有效。Macro2 中断。如果我可以让它工作,我会更喜欢 Macro2,以避免不必要的位,例如创建 %rawfiles、调用 %sysfunc 等。

宏 1:

%let rawcsv = C:\ALL\dat\;

%let rawfiles = m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16 m17;

%macro1;

%do i = 1 %to %sysfunc(countw(&rawfile));
    %let rawfile = %scan(&rawfiles, &i);

proc import datafile="&&rawcsv.&&rawfile.csv" 
                 out=&rawfile replace
                dbms=csv; 
        guessingrows=500; 
run;
%end;
%mend;

%macro1;

宏 2:

%let rawcsv = C:\ALL\dat\;

%macro macro2(first=6, last=19);
%do i=&first. %to &last. %by 1;
proc import datafile="&&rawcsv..m&&i.csv" 
                 out=m&i replace 
                dbms=csv; 
        guessingrows=500;
run;
%end;
%mend;

%macro2;

%macro2 是我对这个解决方案的糟糕模仿。它返回以下错误:

MPRINT(MACRO2):   proc import datafile="C:\ALL\dat\m.6.csv" out=m.6 replace 
dbms=csv;
MPRINT(MACRO2):   ADLM;
MPRINT(MACRO2):   guessingrows=500;
MPRINT(MACRO2):   run;

ERROR: Library name is not assigned. /*repeats this error 14 times, once per file*/

两个问题:

  1. 我在 %macro2 中缺少什么?
  2. 您看到我没有使用的更好的解决方案吗?这些文件的结构不同且不可堆叠,只是提醒一下。

标签: importsasdata-cleaningsas-macro

解决方案


这里的小错字,您需要在 LAST 前面使用 & 而不是 %。

 %do i=&first. %to %last. %by 1;

应该:

 %do i=&first. %to &last. %by 1;

除非您使用名为 last 的单独宏来确定循环的结束。但在这种情况下,您可能也不会有一个名为 last 的参数。

如果您正在寻找替代选项,我通常建议使用数据步骤或 CALL EXECUTE 而不是宏循环一次阅读所有内容,因为在我看来它们更容易调试。

https://communities.sas.com/t5/SAS-Communities-Library/How-do-I-write-a-macro-to-import-multiple-text-files-that-have/ta-p/223627


推荐阅读