import - 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*/
两个问题:
- 我在 %macro2 中缺少什么?
- 您看到我没有使用的更好的解决方案吗?这些文件的结构不同且不可堆叠,只是提醒一下。
解决方案
这里的小错字,您需要在 LAST 前面使用 & 而不是 %。
%do i=&first. %to %last. %by 1;
应该:
%do i=&first. %to &last. %by 1;
除非您使用名为 last 的单独宏来确定循环的结束。但在这种情况下,您可能也不会有一个名为 last 的参数。
如果您正在寻找替代选项,我通常建议使用数据步骤或 CALL EXECUTE 而不是宏循环一次阅读所有内容,因为在我看来它们更容易调试。
推荐阅读
- json - 使用 JsonSanitizer 处理 Java 对象
- jquery - 包含的 jQuery 不适用于包含的 html
- python - django 创建具有多个输入字段的模板
- c# - 获取具有 HorizontalLayoutGroup 组件的 Canvas 内的 UI 对象的 Rect 属性
- facebook - Facebook:获取公共页面的活动信息
- python - 如何将计数(id)添加到查询中
- symfony - 在 Symfony 4 中创建单例实体的最佳方法是什么?
- swagger - 如何在 OpenAPI (Swagger) 中将 $ref 属性声明为只读?
- api - ReferenceError:数据未在角度 6 中定义
- xml - Sed commdand - 当字符串多次出现时,查找和替换字符串模式不起作用